Redis 是Remote Dictionary Server 的缩写,是一个开源的基于内存的数据存储系统,它可以用作数据库缓存和消息队列等各种场景,它也是目前最热门的NOSOL数据库之一。
一、Redis支持多种数据结构
- 字符串string
- 列表list
- 集合set
- 有序集合sortedset
- 哈希hash
- 消息队列 Stream
- 地理空间 Geospatial
- HyperLogLog
- 位图 Bitmap
- 位域 Bitfield
二、Redis的优势
- 性能极高
- 数据类型丰富,单键值对最大支持512M大小的数据
- 简单易用,支持所有主流编程语言
- 支持数据持久化、主从复制、哨兵模式等高可用特性
三、基础命令
3.1 字符串string
- SET key value 设置键key的值为value
- GET key 返回键key的值设置为value
- DEL key [key ...] 删除给定的⼀个或多个键的值
- EXISTS key 判断键是否存在
- FLUSHALL 删除所有的键(谨慎使用)
- KEYS * 查看所有的键
- TTL key 查看键的过期时间
- EXPIRE key 设置键的过期时间
-
SETEX key seconds value 将键 key 的值设置为 value ,并且超时时间为 seconds 秒
-
SETNX key value 只有在键 key 不存在的情况下,将 key 的值设置为 value
3.2 列表list:一般用来存储和操作一组有顺序的数据,和数组的概念比较类似
-
LPUSH key element [element ...] 将⼀个或多个元素添加到列表 key 的表头(左侧) ,多个值则从左⾄右依次插⼊表头,如果列表 key 不存在,则创建⼀个然后执⾏ LPUSH 插⼊操作,如果列表 key 存在但不是列表类型,则返回错误
-
RPUSH key element [element ...] 将⼀个或多个元素添加到列表 key 的表尾(右侧) ,多个值则从左⾄右依次插⼊表尾,如果列表 key 不存在,则创建⼀个然后执⾏ RPUSH 插⼊操作,如果列表 key 存在但不是列表类型,则返回错误
-
LRANGE key 0 -1 获取列表所有元素 0是起始位置 -1表示最后一个元素
-
LPOP key [count ...] 将⼀个或 count个元素从列表头⽅向移除并将其返回,如果列表 key 不存在,则返回 nil
-
RPOP key [count ... ] 将⼀个或 count个元素从列表尾⽅向移除并将其返回,如果列表 key 不存在,则返回 nil
-
LTRIM key start stop 只保留列表 key 中索引为 start 和 stop 之间的元素
3.3 集合set:SET是一种无序集合,它和列表的区别在于,列表中的元素都是可以重复的,而SET中的元素是不能重复的
-
SADD key member [member ...] 将⼀个或多个元素加⼊到集合 key 中。已存在于集合中的元素将被忽略
-
SMEMBERS key 返回集合 key 中的所有成员
-
SISMEMBER key member 判断 MEMBER 是否是集合 key 的成员,是返回 1 ,不是或 key 不存在返回 0
-
SREM key member [member ...] 将⼀个或多个元素从集合 key 中移除。不存在的 member 元素将被忽略
-
SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
3.4 有序集合sortedset:sortedset也叫ZSet,它和集合的区别是:有序集合的每个元素,都会关联一个浮点类型的分数,然后按照这个分数,来对集合中的元素进行从小到大的排序,有序集合的成员是唯一的,但是分数是可以重复的
-
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ..] 将⼀个或多个 member 元素及其分数 score 加⼊到有序集合 key 中
-
ZRANGE key 0 -1 查看集合所有元素 0其实位置 -1最后一个元素
-
ZRANGE key 0 -1 WITHSCORES 查看集合所有分数和元素
-
ZSCORE key member 返回有序集合 key 中的成员 member 的分数值( score )
-
ZRANK key member 返回有序集合 key 中成员 member 的排名。(按照 score 从⼩到⼤排列)
-
ZREVRANK key member 返回有序集合 key 中成员 member 的排名。(按照 score 从⼤到⼩排列)
-
ZREM key member [member ..] 将⼀个或多个成员从集合 key 中移除。不存在的 member 成员将被忽略
3.5 哈希hash:哈希 是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合,特别适合用来存储对象
- HSET key field value [field value ...] 将哈希表key中的域field的值设置为value
-
HGET key field 返回哈希表 key 中给定域 field 的值
-
HGETALL key 返回哈希表 key 中所有的域和值
-
HDEL key field [field ...] 删除哈希表 key 中的⼀个或多个指定域 field
-
HEXISTS key field 判断给定域 field 是否存在于哈希表 key 中
-
HKEYS key 返回哈希表 key 中的所有键
-
HVALS key 返回哈希表 key 中所有域的值
3.6 发布订阅模式:Redis提供了发布订阅的功能,可以通过PUBLISH命令,来将消息发送到指定的频道,然后通过SUBSCRIBE命令,来订阅这个频道,这样就可以接收到这个频道的消息了,但是发布订阅功能还有一些局限性,比如消息无法持久化,无法记录历史消总等等, 消息队列 Stream可以解决这个问题
- SUBSCRIBE channel [channel ...] 订阅一个channel频道
- PUBLISH channel message 向channel频道发送消息
3.7 消息队列 Stream:Stream是Redis 5.0版本中,引入的一个新的数据结构,它是一个轻量级的消息队列
- XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...] 向流追加⼀个新的消息,如果key不存在则创建
- XLEN key 返回流key中消息的数量
- XRANGE key start end [COUNT count] 返回流key中,id位于start和end之间的消息可以用+ - 代替
- XDEL key id [id ...] 从流key中移除消息并返回移除消息的数量
- XTRIM key 0 代表删除所有的消息
- XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] 读取和返回流key中⽐id⼤的消息,若没有则阻塞⾄消息可⽤
- XGROUP CREATE key groupname id|$ [MKSTREAM] [ENTRIESREAD entries_read] 创建⼀个消费者组
- XINFO GROUPS key 返回流key的消费者组列表
3.8 地理空间 Geospatial: Geospatial是Redis3.2版本中的新特性,它提供了一种存储地理位置信息的数据结构,同时支持对地理位置进行各种计算操作,比如计算两个位置之间的距离,获取某个地理位置的经纬度,查找附近的人等等
- GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...] 添加⼀个或者多个成员到地理空间中
- GEOPOS key member [member ...] 返回⼀个或多个成员的位置经纬度信息
- GEODIST key member1 member2 [M|KM|FT|MI] 返回两个成员的距离
- GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] 指定范围内搜索member并返回。可以按成员(FROMMEMBER),或按经纬度(FROMLONLAT),范围可以是圆形( BYRADIUS)或矩形(BYBOX)
3.9 HyperLogLog :HyperLogLog是一种用来做基数统计的算法,如果集合中的每个元素都是唯一且不重复的,那么这个集合的基数就是集合中元素的个数,比如集合12345的基数就是5,而把12345后面再加上12345,变成一个十个元素的集合的话,它的基数还是5,HyperLogLog算法就是用来计算这个基数的,它的原理是使用随机算法来计算,通过牺牲一定的精确度,来换取更小的内存消耗,优点就是占用内存小,缺点就是会有一定的误差,所以它适合用来做一些对精确度要求不高的,而且数据非常大的统计工作,比如统计某个网站的uv,统计某个词的搜索次数等等
四、 Redis事务
redis支持事务,但redis的事务和mysql的事务是不一样的,mysql的事务要么全部执行成功,要么全部执行失败,而在redis中,事务并不能保证所以都命令都会执行成功
- MULTI 开启一个事务
- EXEC 执行事务
五、Redis持久化
持久化是redis中一个重要的功能,因为redis是基于内存的数据库,如果没有持久化,一旦服务器重启或者断电,之前所有的数据都会丢失。
redis的持久化有两种方式:
1.RDB 快照保存,缺点如果在服务器宕机了,最后一次快照之后的所有修改内容都会丢失掉,rdb更适合做来备份
2.它是以日志的形式来记录每一个写操作,当redis重启的时候,就要通过执行AOF文件的命令来在内存中重建整个数据库的内容。
- RDB 在指定时间间隔内,内存的数据快照写入磁盘。可以在vim redis.vonf找到save参数进行配置,例如 save 3600 1 第一个参数代表秒数,第二个参数表示修改次数。在终端直接输入save命令可以手动执行快照 生成的文件dump.rdb bgsave会单独创建一个子进程,将内存的数据写入硬盘中
- AOF 开启AOF的方式在vim redis.vonf文件 appendonly这个值改成yes就可以了
六、主从复制
主从复制是将一台redis服务器的数据,复制到其他redis服务器中,也叫主节点和从节点,一个主节点可以有多个从节点。一般来说主节点负责写操作,从节点负责读操作。
- 配置主从复制:主节点不需要修改任何配置,默认的配置就是主节点,只需要修改从节点的配置就可以了
- 修改redis.conf这个配置文件
- port 6380 修改端口号改成6380
- pidfile /var/run/redis_6380.pid pidfile文件也改成6380
- dbfilename dump-6380.rdb 这个是rdb文件也修改成功6380
- replicaof 127.0.0.1 6379 把replicaof打开表示这个是6379的从节点
进入从节点输入命令:info replication
role:slave 看到slave表示这个是从节点
七、哨兵模式
redis哨兵模式可以实现主从复制自动故障转移,它会以一个独立的进程,运行在redis集群中,用来监控redis集群中的各个节点是否运行正常。
1.监控。通过不断的发送命令,来检查redis是否正常
2.通知。如果发现某个节点出现了问题,哨兵就会发送订阅模式来通知其他节点
3.自动故障转移。当主节点不能正常工作,哨兵会开启一个自动故障转移的操作,它会将一个从节点升级为新的主节点,让其他从节点执行新的主节点
哨兵本身也是一种进程,它自己也有单节点故障的问题,一般在实际的生成环境,会使用3个哨兵节点来保证高可用,这三个哨兵会通过选举的方式选出一个领导者,然后由领导者来监控其他节点,如果领导者挂了,其他哨兵节点会重新选取一个领导者
- 在redis中添加一个sentinel.conf文件
- 在文件中添加
- sentinel monitor master 127.0.0.1 6379 1
- master表示要监控的主节点名称 + 主节点的ip和端口号 参数1表示一个哨兵,一般配置3个
- redis-sentinel sentinel.conf 启动哨兵节点