第一章.Redis简单介绍
官网: https://redis.io/
Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引 (string,hash,list,set,zset,geo )。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性,它的数据都放在内存中,所以它的读写是非常快的,它还可以将内存中的数据缓存到本地磁盘上,使用的方式是通过快照和日志的形式保存在本地磁盘上,它还有键值过期,发布订阅,流水线,哨兵等等很强大的功能,这些下面的篇幅会慢慢介绍,只要记住一点就行,一个字 快,非常快。
第二章.为什么要使用它呢?
2.1 速度快
所有数据都存放在内存
基于底层C语言实现
单线程架构,节省了数据的来回交替
2.2 键值对数据结构
- 列表
- 哈希
- 字符串
- 集合
- 有序集合
2.3 数据持久化
通过RDB和AOF形式实现
2.4 简单稳定
源代码量少,使用单线程模型,不依赖操作系统中的类库
2.5 附件功能
- 键过期,可以实现缓存
- 发布订阅,可以实现消息系统
- pipeline功能,可以实现批量命令操作Redis
- 支持的接口多,java,PHP,python,C,C++,Nodejs等
- 在 2.8.9 版本添加了 HyperLogLog 结构 , 用来做基数统计的算法
- 支持事务
2.6 扩展
1.集群
2.哨兵
3.主从复制
第三章.应用场景
3.1 缓存-键过期时间
缓存session会话:
用户访问网站会话失效性,一段时间内不来访问,将session设定失效
作为Redis的缓存层使用:
缓存用户的热点数据,本地Redis没有的话,去mysql拿回来在本地存,下载就从本地取数据.
3.2 排行榜-列表&有序结合
根据点击率排序
发布时间排序
3.3 计数器
访问量类型的增加,
例如,商品浏览器,视频播放量,
4.4 社交网络-集合
赞.踩.粉丝.爱好.标签.推送.标签.相似度匹配|
例如 A和B有相同的爱好,可以统计给C的信息是AB共同的爱好.有针对性的集合数据
4.5 消息队列-发布订阅
这个功能需要配合ELK实现
四: Redis单点部署
4.1 环境规划
角色 | 主机 |
---|---|
Redis01 | 192.168.188.159 |
Redis02 | 192.168.188.160 |
Redis03 | 192.168.188.161 |
4.2 目录规划
/data/soft/ #redis下载目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid} #redis安装目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb #redis数据目录
/server/scripts/redis_shell.sh #redis运维脚本
[root@redis01 ~]# tail -3 /etc/hosts
192.168.188.159 Redis01
192.168.188.160 Redis02
192.168.188.161 Redis03
4.3 安装Redis
#!/bin/bash
##############################################################
# File Name: install_redis.sh
# Version: V1.0
# Author: liych
# Organization: http://itshangyun.com
# Created Time : 2020-03-20 19:31:03
# Description:
##############################################################
#make distclean && make
yum install gcc -y
mkdir -p /data/soft
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
make && make install 做的事就是将你的程序的命令放到系统内的/usr/local/bin/下变为可执行程序命令,这样方便命令行内直接敲命令.
redis-3.2.10.tar.gz | 28-Jul-2017 12:00 | 1.5M |
---|---|---|
版本下载地址 | 更新时间 | 软件包大小 |
4.4 配置文件
cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf<<EOF
### 以守护进程模式启动
daemonize yes
### 绑定主机上的网卡IP地址,这里需要修改成你当前主机的内网IP地址,
bind 127.0.0.1 192.168.188.159
### 监听端口,默认的端口如需修改请自行修改
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0,集群只有一个0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379/
EOF
如果想自己定义配置文件请参考: install_server.sh
[root@redis01 utils]# ll /opt/redis_cluster/redis-3.2.9/utils/install_server.sh
-rwxrwxr-x 1 root root 8545 5月 17 2017 /opt/redis_cluster/redis-3.2.9/utils/install_server.sh
4.5 程序启动Redis
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
4.6 Systemctl启动Redis
1.添加使用系统管理
cat > /usr/lib/systemd/system/redis.server <<EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf --daemonize yes
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
----------------
2.测试可以使用
[root@redis01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.188.159:6379 0.0.0.0:* LISTEN 17959/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 17959/redis-server
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1021/sshd
tcp6 0 0 :::22 :::* LISTEN 1021/sshd
[root@redis01 ~]# systemctl stop redis
[root@redis01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1021/sshd
tcp6 0 0 :::22 :::* LISTEN 1021/sshd
[root@redis01 ~]# systemctl start redis
[root@redis01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.188.159:6379 0.0.0.0:* LISTEN 17973/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 17973/redis-server
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1021/sshd
tcp6 0 0 :::22 :::* LISTEN 1021/sshd
[root@redis01 ~]#
4.7 检查服务
ps -ef|grep redis
netstat -lntup|grep redis
4.8 测试登录
[root@redis01 ~]# redis-cli
127.0.0.1:6379>
[root@redis01 ~]# redis-cli -h redis01
redis01:6379>
这个命令行提示 代表进入到redis内
4.9 关闭redis
1.关闭
[root@redis01 ~]# redis-cli
127.0.0.1:6379> SHUTDOWN
2.关闭
redis-cli -h shutdown
五:全局命令
Redis 有5中数据结构,他们是键值对中的值,对于键的一些同用命令如下
5.1 设定key的值
# 语法
SET key value
---
# 示例
set k1 v1 #设定的key 是 k1 设定的value 是值
5.2 查看所有命键
语法 KEYS *
#列出当前redis的键值,数据是存在内存中的
---
# 示例
redis01:6379> KEYS k1
1) "k1"
5.3 查看键的总数
语法
DBSIZE
#计算键总数的时候不是遍历所有键,直接获取内置键的总数变量
---
# 示例
redis01:6379> DBSIZE
(integer) 1
5.4 查看键是否存在
语法
EXISTS key [key ...]
#返回1表示存在,返回0表示不存在,返回N表示N个key存在
---
示例
redis01:6379> EXISTS k1
(integer) 1
5.5 查看键类型
语法
DEL key [key ...]
#返回1表示删除,返回0表示删除的key不存在,返回N表示删除多个key
---
示例
redis01:6379> DEL k1
(integer) 1
5.6 删除键
5.7 键过期
EXPIRE key seconds
# 设定键过期时间 当超过过期时间,会自动删除键
PERSIST key
# 取消设定键过期时间,原值不变
以上两种返回值说明
- 返回1表示key存在并设定过期时间成功,返回0表示不存在
# ttl 观察键的剩余时间
大于0的整数: 剩余过期时间
-1 : 键没有设定过期时间,永久留存
-2 : 没有key,在ttl中代表没有设定key的过期时间
5.8 键过期案例
①.优惠卷永不过期
1.redis01:6379> set Coupon 100 #设定一个优惠卷 100
OK
redis01:6379> get Coupon
"100"
redis01:6379> EXPIRE Coupon 86400 #设定过期时间24小时
(integer) 1
redis01:6379> ttl Coupon
(integer) 86391
redis01:6379> ttl Coupon
(integer) 86389
redis01:6379> ttl Coupon
(integer) 86389
redis01:6379> ttl Coupon
(integer) 86386
redis01:6379> ttl Coupon
(integer) 86383
redis01:6379> SET Coupon 50 #重新设定了这个优惠卷的key
OK
redis01:6379> ttl Coupon #发现永不过期
(integer) -1
②.那么怎么办呢? 使用perstst 取消设定过期时间,为不过期.
redis01:6379> PERSIST Coupon
(integer) 0
redis01:6379> ttl Coupon
(integer) -1
redis01:6379> ttl Coupon
(integer) -1
第三章.操作数据类型
3.1 字符串 String
3.1.1 语法结构
字符串可以一次性插入多个元素 set key value key value
1. 通常用SET command 和 GET command来设置和获取字符串值
2. MSET和MGET可以一次存储或获取多个key对应的值.
3. INCR命令将字符串值解析成整型.将其加1,多次执行自增+1,最后结果保存为新的字符串,类似命令: INCRBY,DECR,DECRBY
- INCRBY命令 可以指定key的值 增加任意值的数量,可以用在刷帖或者是流量方面
- DECR命令 可以将key中存储的值-1
- DECRBY 可以将key 所储存的值减去给定的减量值
4. EXISTS命令返回1或0标识给定key的值是否存在.
5. 使用DEL可以删除key对应的值,DEL命令返回1或0标识是被删除(值存在)或者没被删除(key对应的值不存在).
6. TYPE可以返回key对应的存储类型
7. EXPIRE命令可以对key设置一个超时时间,当这个时间到达后被删除
8. PERSIST命令去除超时时间
3.1.2 操作示例
操作实例:
1.设定key
redis01:6379> set kname vliych
OK
2.查看值
redis01:6379> get kname
"vliych"
3.单独查看一个key
redis01:6379> KEYS kname
1) "kname"
4.设定key
redis01:6379> set kname1 vitshangyun
OK
5.设定多个key和值
redis01:6379> MSET kname2 vlizicheng kname3 vweichunxue
OK
6.查看多个key
redis01:6379> MGET kname kname2 kname3
1) "vliych"
2) "vlizicheng"
3) "vweichunxue"
7.查看所有的key
redis01:6379> KEYS *
1) "k1"
2) "kname2"
3) "kname1"
4) "kname"
5) "kname3"
8.计数器功能 注意的是值必须要是数字才可以实现自增效果
redis01:6379> set kstring 1
OK
redis01:6379> TYPE kstring
string
redis01:6379> INCR kstring
(integer) 2
redis01:6379> INCR kstring
(integer) 3
redis01:6379> INCR kstring
(integer) 4
redis01:6379> INCR kstring
(integer) 5
redis01:6379> get kstring
"5"
9.在原值5基础上自增50为55
redis01:6379> INCRBY kstring 50
(integer) 55
redis01:6379> get kstring
"55"
10.在原值基础上减5为50
redis01:6379> INCRBY kstring -5
(integer) 50
redis01:6379> get kstring
"50"
11.设定key的过期时间
redis01:6379> EXPIRE kname 40
(integer) 1
redis01:6379> ttl kname
(integer) 32
redis01:6379> ttl kname
(integer) 30
redis01:6379> ttl kname
(integer) 29
redis01:6379> ttl kname
(integer) 19
redis01:6379> ttl kname
(integer) 4
redis01:6379> ttl kname
(integer) -2
redis01:6379> get kname
(nil)
12.取消设定k1设定的过期时间
redis01:6379> get k1
"v1"
redis01:6379> EXPIRE k1 40
(integer) 1
redis01:6379> ttl k1
(integer) 36
redis01:6379> PERSIST k1
(integer) 1
redis01:6379> ttl k1
(integer) -1
3.2 列表 List
列表的插入模式就像我们平时打兵乓球的时候,要么站在左边,要么我站在右边,没可能站在中间打台球吧,请记住一点列表插入数据的时候没有我们平时的那种插队模式. 一个列表最多可以包含2的32次方 (4294967295, 每个列表超过40亿个元素)。
3.2.1 语法结构
列表可插入多个值, LPUSH key value [value ...],但是不可以一次删除多个值
1. LPUSH 从列表左侧插入数据元素,可插入单个或多个元素
2. RPUSH 从列表右侧插入数据元素,可插入单个或多个元素
3. LRANGE 从列表中取出范围数据元素; 列表起始值是0,1,2,3开始,0 -1全部
4. RPOP 从列表右删除数据元素并返回删除值的元素,只可删除单个元素
5. LPOP 从列表左删除数据元素并返回删除值的元素,只可删除单个元素
6. LLEN 查看列表的长度
3.2.2 操作示例
1.从左侧插入元素
redis01:6379> LPUSH list A
(integer) 1
redis01:6379> LPUSH list B
(integer) 2
redis01:6379> LPUSH list C
(integer) 3
2.从右侧插入元素
redis01:6379> RPUSH list 1
(integer) 4
redis01:6379> RPUSH list 2
(integer) 5
redis01:6379> RPUSH list 3
(integer) 6
3.查看key类型
redis01:6379> TYPE list
list
4.查看列表长度
redis01:6379> LLEN list
(integer) 6
5.查看全部列表
redis01:6379> LRANGE list 0 -1
1) "C"
2) "B"
3) "A"
4) "1"
5) "2"
6) "3"
6.查看6)的值 列表值开始为0,依次往右排序
redis01:6379> LRANGE list 0 5
1) "C"
2) "B"
3) "A"
4) "1"
5) "2"
6) "3"
7.查看4)的值
redis01:6379> LRANGE list 0 3
1) "C"
2) "B"
3) "A"
4) "1"
8.右侧删除一个值
redis01:6379> RPOP list
"3"
redis01:6379> LRANGE list 0 -1
1) "C"
2) "B"
3) "A"
4) "1"
5) "2"
9.左侧删除一个值
redis01:6379> LPOP list
"C"
redis01:6379> LRANGE list 0 -1
1) "B"
2) "A"
3) "1"
4) "2"
3.3 哈希 Hash
hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。它可以每秒查询几十万条数据,每个 hash 可以存储键值对(40多亿)。
3.3.1 语法结构
HMSET 同时将多个 field-value (域-值)对设置到哈希表 key 中
HGET 获取存储在哈希表中指定字段的单个域
HGETALL 获取在哈希表中指定key的所有字段和值
HDEL 删除一个或多个哈希表字段
HEXISTS 查看哈希表 key 中,指定的字段是否存在。
3.3.2 操作示例
需求: 需要用redis缓存MySQL的用户信息
mysql_user | ||||
---|---|---|---|---|
id | name | age | job | hobby |
1 | itshangyun | 18 | IT | IT |
2 | liych | 19 | ktv | ktv |
1.插入hash数据
redis01:6379> HMSET user:1 name itshangyun age 18 job IT hobby IT
OK
redis01:6379> HMSET user:2 name liych age 19 job ktv hobby ktv
OK
2.查看key中的单个值
redis01:6379> HMGET user:2 name
1) "liych"
3.查看key中的多个值
redis01:6379> HMGET user:2 name age
1) "liych"
2) "19"
4.查看key中全部值,可以瞬间查看几十万条数据,都可以,在于你的内存性能
redis01:6379> HGETALL user:2
1) "name"
2) "liych"
3) "age"
4) "19"
5) "job"
6) "ktv"
7) "hobby"
8) "ktv"
3.4 集合 Set
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据, Redis 中集合是通过哈希表实现的.
3.4.1 语法结构
SADD 命令可以把新的元素添加到set中
SREM 移除集合中一个或多个值
SINTER 返回给定所有集合的交集
SDIFF 返回给定所有集合的差集
SUNION 返回所有给定集合的并集,并集没有重复数字出现
3.4.2 操作示例