导图社区 Redis
这是一篇关于Redis的思维导图,主要内容包括:八、Redis持久化,七、Redis事务,六、发布和订阅,二、启动,一、安装Redis7.0,五、Redis配制文件,四、Redis数据类型,三、Redis键(key)相关的命令。
编辑于2024-03-28 15:31:48Redis
一、安装Redis7.0
1. 下载;放到opt目录下
https://redis.io/download/
2. 解压;在opt目录下
tar -zxvf redis-7.0.0.tar.gz
解压后

3. 进入目录redis-7.0.11
安装gcc
yum install gcc-c++
make
make install
截图
 …………………… 
4. 默认安装目录
/usr/local/bin
Linux下的/usr/local类似我们windows系统的C:\Program Files
查看

redis-benchmark:性能测试工具,服务启动后运行该命令,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件
redis-check-dump:修复有问题的dump.rdb文件
redis-cli:客户端,操作入口
redis-sentinel:redis集群使用
redis-server:Redis服务器启动命令
5. 修改redis.conf配制文件
redis.conf配置文件,改完后确保生效,记得重启: 默认daemonize no 改为 daemonize yes (支持后台启动) 默认protected-mode yes 改为 protected-mode no 默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能木机访问)或改成木机IP地址。否则影响远程IP连接 添加redis密码 改为 requirepass 你自己设置的密码
二、启动
进入Redis默认安装目录
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口
如果设置了密码:auth 密码
后台启动
备份Redis.conf
daemonize no 改成 yes
[root@ecs-353138 redis-7.0.0]# redis-server ./redis.conf
启动redis要指定配置文件,没有显式指定配置文件,其实redis默认读取的是内部的配置文件,而不是安装目录下的redis.conf
关闭
单实例关闭:redis-cli -a 密码 shutdown
多实例关闭:指定端口关闭:redis-cli -p 6379 shutdown
卸载Redis
1. 停止Redis服务
2. 删除/usr/local/lib目录下与redis相关的文件
三、Redis键(key)相关的命令
keys *
查看当前库所有key
exists key
判断某个key是否存在
type key
查看你的key是什么类型
del key
删除指定的key数据
unlink key
根据value选择非阻塞删除
Redis UNLINK 命令跟 DEL 命令十分相似:用于删除指定的 key 。就像 DEL 一样,如果 key 不存在,则将其忽略。但是,该命令会执行命令之外的线程中执行实际的内存回收,因此它不是阻塞,而 DEL 是阻塞的。这就是命令名称的来源:UNLINK 命令只是将键与键空间断开连接。实际的删除将稍后异步进行。
expire key 10
10秒钟,为给定的key设置过期时间
ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期
select 0
切换数据库
disize
查看当前数据库的key的数量
flushdb
清空当前库
flushall
通杀全部库
四、Redis数据类型
五种基本数据类型
string(字符串)
简介
String是Redis最基本的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。一个Redis中字符串value最多可以是512M。
常用命令
string数据类型常用命令 【 set <key><value> 】 添加键值对。  NX:当数据库中key不存在时,可以将key-value添加数据库。 XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥。 EX:key的超时秒数。 PX:key的超时毫秒数,与EX互斥。 2. 【 get <key> 】查询对应键值。 3. 【 append <key><value> 】将给定的<value> 追加到原值的末尾。 4. 【 strlen <key> 】获得值的长度。 5. 【 setnx <key><value> 】只有在 key 不存在时,设置 key 的值。 6. 【 incr <key> 】将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1。 7. 【 decr <key> 】将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1。 8. 【 incrby / decrby <key><步长> 】将 key 中储存的数字值增减,自定义步长。 9. 【 mset <key1><value1><key2><value2> ..... 】同时设置一个或多个 key-value对。 11.【 mget <key1><key2><key3> ..... 】同时获取一个或多个 value。 12. 【 msetnx <key1><value1><key2><value2> ..... 】同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 13. 【 getrange <key><起始位置><结束位置> 】获得值的范围,类似java中的substring,前包,后包。 14. 【 setrange <key><起始位置><value> 】用 <value> 覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。 15. 【 setex <key><过期时间><value> 】设置键值的同时,设置过期时间,单位秒。 16. 【 getset <key><value> 】以新换旧,设置了新值同时获得旧值。
set key value NX
NX: 当数据库中key不存在时,可以将key-value添加数据库 XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥 EX:key的超时秒数 PX:key的超时毫秒数,与EX互斥
添加键值对
get key
查询对应键值
append key value
将给定的 value 追加到原值的末尾
strlen key
获得值的长度
setnx key value
只有在 key 不存在时 设置 key 的值
incr key
将 key 中储存的数字值增1
decr key
将 key 中储存的数字值减1
只能对数字值操作,如果为空,新增值为1或者-1
incrby / decrby key 步长
将 key 中储存的数字值增减。自定义步长
mset key1 value1 key2 value2
同时设置一个或多个 key-value对
mget key1 key2
同时获取一个或多个 value
msetnx key1 value1 key2 value2
原子性,有一个失败则都失败
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
getrange key 起始位置 结束位置
获得值的范围,类似java中的substring,前包,后包
setrange key 起始位置 value
用 value 覆写 key 所储存的字符串值,从 起始位置 开始(索引从0开始)
setex key 过期时间 value
设置键值的同时,设置过期时间,单位秒
getset key value
以新换旧,设置了新值同时获得旧值
数据结构
string数据结构 String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。
list(列表)
简介
单键多值,按照插入的顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常用命令
lpush / rpush key value1 value2
从左边/右边插入一个或多个值
lpop / rpop
从左边/右边吐出一个值。值在键在,值光键亡
rpoplpush key1 key2
从key1列表右边吐出一个值,插到key2列表左边
lrange key start stop
lrange age 0 -1,表示获取所有
按照索引下标获得元素(从左到右)
lindex key index
按照索引下标获得元素(从左到右)
llen key
获得列表长度
linsert key before value newvalue
在value的前面插入newvalue的值
lrem key n value
从左边删除n个value(从左到右)
lset key index value
将列表key下标为index的值替换成value
数据结构
① List的数据结构为快速链表quickList。 ② 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。 ③ 当数据量比较多的时候才会改成quicklist
set(集合)
简介
自动排重、Set是string类型的无序集合,底层是一个value为空的hash表,增删查的复杂的都是O(1)
常用命令
set常用命令 1. 【 sadd <key><value1><value2> ..... 】将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略。 2. 【 smembers <key> 】取出该集合的所有值。 3. 【 sismember <key><value> 】判断集合<key>是否为含有该<value>值,有1,没有0。 4. 【 scard<key> 】返回该集合的元素个数。 5. 【 srem <key><value1><value2> .... 】删除集合中的某个元素。 6. 【 spop <key> 】随机从该集合中吐出一个值。 7. 【 srandmember <key><n> 】随机从该集合中取出n个值。不会从集合中删除 。 8. 【 smove <source><destination>value 】把集合中一个值从一个集合移动到另一个集合。 9. 【 sinter <key1><key2> 】返回两个集合的交集元素。 10. 【 sunion <key1><key2> 】返回两个集合的并集元素。 11. 【 sdiff <key1><key2> 】返回两个集合的差集元素(key1中的,不包含key2中的)。
sadd key value1 value2
将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers key
取出该集合的所有值
sismember key value
判断集合key是否为含有该value值,有1,没有0
scard key
返回该集合的元素个数
srem age value1 value2
删除集合中的某个元素
spop key
随机从该集合中吐出一个值
srandmember key n
随机从该集合中取出n个值。不会从集合中删除
smove source destination value
把集合中一个值从一个集合移动到另一个集合
sinter key1 key2
返回两个集合的交集元素
sunion key1 key2
返回两个集合的并集元素
sdiff key1 key2
返回两个集合的差集元素(key1中的,不包含key2中的)
数据结构
① Set数据结构是dict字典,字典是用哈希表实现的。 ② Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
hash(哈希)
简介
Redis hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象。
常用命令
hset key field value
给key集合中的 field键赋值value
hget key field
从key1集合field取出 value
hmset key1 field1 value1 field2 value2
批量设置hash的值
hexists key field
查看哈希表 key 中,给定域 field 是否存在
hkeys key
列出该hash集合的所有field
hvals key
列出该hash集合的所有value
hincrby key field increment
为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx key field value
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
zset(有序集合)
简介
zset与普通集合set非常相似,是一个没有重复元素的字符串集合,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
常用命令
zadd key score1 value1 score2 value2
将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zrange key start stop [WITHSCORES]
返回有序集 key 中,下标在 start stop之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集
zrangebyscore key min max
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列
zrevrangebyscore key max min
改为从大到小排列
zincrby key increment value
为元素的score加上增量
zrem key value
删除该集合下,指定值的元素
zcount key min max
统计该集合,分数区间内的元素个数
zrank key value
返回该值在集合中的排名,从0开始
数据结构
hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
三种高级数据类型
Bitmaps
Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。
HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法。 HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
Geospatial
GEO:Geographic,地理信息的缩写。该类型,就是元素的二维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
五、Redis配制文件
网络相关配制
bind
默认情况bind=127.0.0.1只能接受本机的访问请求
protected-mode
将本机访问保护模式设置no
port
端口,默认6379
timeout
一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭
tcp-keepalive
单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60
对访问客户端的一种心跳检测,每个n秒检测一次
GENERAL通用
daemonize
是否为(守护进程)后台进程,设置为yes
pidfile
存放pid文件的位置,每个实例会产生一个不同的pid文件
loglevel
生产环境选择notice 或者warning
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
logfile
日志文件名称
databases 16
设定库的数量 默认16,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
SECURITY安全
设置密码
LIMITS限制
maxclients
设置redis同时可以与多少个客户端进行连接
默认情况下为10000个客户端
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应
maxmemory
maxmemory-policy
maxmemory-samples
六、发布和订阅
什么是发布和订阅?
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
客户端订阅该频道
当给这个频道发布消息后,消息就会发送给订阅的客户端
命令实现
打开一个客户端订阅channel1
subscribe channel1
打开另一个客户端,给channel1发布消息hello
publish channel1 hello
返回的2是订阅的数量
七、Redis事务
1、定义
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
2、Multi、Exec、discard
① 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。 ② 组队的过程中可以通过discard来放弃组队
组队成功,提交成功
组队阶段报错,提交失败
组队成功,提交有成功有失败
3、事务的错误处理
组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
4、Redis事务三特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
八、Redis持久化
RDB(Redis DataBase)
是什么?
在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
备份如何执行
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork
Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
dump.rdb文件
在redis.conf中配置文件名称,默认为dump.rdb
优势
适合大规模的数据恢复
对数据完整性和一致性要求不高更适合使用
节省磁盘空间
恢复速度快
不足
在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。
总结
AOF(Append Only File)
是什么?
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
AOF持久化流程
AOF默认不开启
AOF和RDB同时开启,redis听谁的?
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
优势
备份机制更稳健,丢失数据概率更低
不足
比起RDB占用更多的磁盘空间
恢复备份速度要慢。
总结