第一章.Redis简单介绍
官网: https://redis.io/
Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引 (string,hash,list,set,zset,geo )。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性,它的数据都放在内存中,所以它的读写是非常快的,它还可以将内存中的数据缓存到本地磁盘上,使用的方式是通过快照和日志的形式保存在本地磁盘上,它还有键值过期,发布订阅,流水线,哨兵等等很强大的功能,这些下面的篇幅会慢慢介绍,只要记住一点就行,一个字 快,非常快。
第二章.为什么要使用它呢?
2.1 速度快
所有数据都存放在内存
基于底层C语言实现
单线程架构,节省了数据的来回交替
2.2 键值对数据结构
1. 列表
2. 哈希
3. 字符串
4. 集合
5. 有序集合
2.3 数据持久化
通过RDB和AOF形式实现
2.4 简单稳定
源代码量少,使用单线程模型,不依赖操作系统中的类库
2.5 附件功能
1. 键过期,可以实现缓存
2. 发布订阅,可以实现消息系统
3. pipeline功能,可以实现批量命令操作Redis
4. 支持的接口多,java,PHP,python,C,C++,Nodejs等
5. 在 2.8.9 版本添加了 HyperLogLog 结构 , 用来做基数统计的算法
6. 支持事务
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-5.0.7.tar.gz
tar zxf redis-5.0.7.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-5.0.7/ /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 查看键类型
语法
TYPE key 命令用于返回 key 所储存的值的类型。
---
返回 key 的数据类型,数据类型有:
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
---
示例
redis01:6379> set name liych
OK
redis01:6379> TYPE name
string
5.6 删除键
语法
DEL key [key ...]
#返回1表示删除,返回0表示删除的key不存在,返回N表示删除多个key
---
示例
redis01:6379> DEL k1
(integer) 1
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 返回所有给定集合的并集,并集没有重复数字出现
SMEMBERS 返回集合中的所有值的元素,并排序显示
4.2 操作示例
1.插入2个集合
redis01:6379> SADD set1 1 2 3
(integer) 3
redis01:6379> SADD set2 3 4 5
(integer) 3
2.查看数据类型是set
redis01:6379> TYPE set1
set
redis01:6379> TYPE set2
set
3.显示集合内的成员信息
redis01:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
redis01:6379> SMEMBERS set2
1) "3"
2) "4"
3) "5"
4.查看两个集合的交集是 3
redis01:6379> SINTER set1 set2
1) "3"
5.查看两个集合的差集是 1 2
redis01:6379> SDIFF set1 set2
1) "1"
2) "2"
6.查看两个集合的并集 这里是将3剔除的了,3属于 集合1和集合2共有. 将其覆盖
redis01:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
3.5 有序集合 sorted set
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。