这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
Redis
Redis是使用C语言开发的高性能键值对(key-value)
,是一种基于内存的非关系型数据库,可以用作数据库、缓存、消息中间件等。
Redis的优点
-
基于内存操作,性能优秀、读写速度非常快。
-
支持多种数据类型。包括
string、list、set、hash、sortedset
五种基本数据类型,还包括geospatal、HyperLogLog、BitMaps
三种特殊的数据类型。 -
支持数据持久化。Redis提供了AOF和RDB两种持久化方式,可以将内存中的数据持久化到磁盘中,当Redis重启时会加载之前保存到磁盘的数据到内存中。
-
可以用作消息中间件,支持发布订阅
-
主从复制、哨兵、高可用。Redis支持主从复制,允许将一台主Redis服务器中的数据复制到另一台从Redis服务器中,且提供了哨兵模式(即当主节点崩掉后,自动选取新的主节点的机制),保证了Redis集群环境下的高可用。
五种基本数据类型
🚨注意:下面讲的数据类型是指Redis值的数据类型,而Redis键的类型总是string。
字符串string
字符串string是Redis最基本的数据类型,一个key对应一个value,其中value不仅可以是字符串,也可以是整型数据。
常见操作
get key
(根据键获取对应的值)set key value
(添加一个键值对)del key
(根据key删除对应的键值对)mset key1 value1 key2 value2..
(一次添加多个键值对)mget key1 key2 ..
(根据多个键一次获取多个键值对的值)strlen key
(根据键获取对应键值对的值的字符长度)append key value
(将指定的字符串追加到键值对中key对应的value上)
✨string在Redis中存储的默认就是一个string类型的数据,当使用incr、decr操作时会将字符串类型的值转换成整形或者浮点型然后再进行计算。🚨注意:如果原始的数据类型不能转换为整形或者浮点型、或者处理的数值超过了redis数值计算的最大值(long的最大值),则会报错。
-
incr key
(将key对应的value的值+1) -
incrby key 数值
(将key对应的value的值加上指定的整数值) -
incrbyfloat key 数值
(将key对应的value的值加上指定的单浮点数值) -
decr key
(将key对应的value的值-1) -
decr key 数值
(将key对应的value的值减去指定的整数值)
⏰设置键值对的有效时间
-
setex key 秒 value
-
psetex key 毫秒 value
应用场景
如在掘金中对一篇文章进行点赞,增加点赞量、显示文章浏览量.
- 初始化
set post:id:00001:views 0
set post:id:00001:live 0
- 增加点赞、增加阅读量、显示阅读量:
-
incr post:id:00001:live
-
incr post:id:00001:views
-
get post:id:00001:views
哈希hash
hash数据类型是一个存储多个键值(key-value)的集合,可以将其看为key-Map{(field1,value1),(field2,value2)...}
,由字段field与值value相关联组成的映射,字段和值都是字符串,其中Map里面可以存储2^32-1个field-value
键值对,不允许存储重复的key,特别适合存储对象。
常见操作
-
hset key field value
存储一个field value键值对 -
hmset key field1 value1 field2 value2...
一次存储多个field value -
hget key field
获取指定的field对应的值 -
hgetall key
获取所有的field和value,效率低 -
hmget key field1 field2
一次获取多个字段值 -
hlen key
获取集合长度 -
hdel key field
根据key、field删除指定的键值对 -
hexists key field
判断hash中的某个key是否存在 -
hkeys key
获取所有的field -
hvals key
获取所有的value -
hincrby key field 自增值
将指定的field对应的value自增(指定自增值) -
hincrbyfloat key field 自增值
将指定的field对应的value自增(指定自增值),为浮点类型 -
hsetnx key field value
如果hash集合中不存在指定的filed则可以添加该键值对 -
hlen key
获取指定hash表的数量 -
hexists key field
判断指定hash中的指定字段filed是否存在(存在时返回1) -
hkeys key
根据key获取所有的field -
hvals key
根据key获取所有的field对应的value
应用场景
hash数据类型实现购物车中的基本操作,如选中购物车中的所有商品、移除商品、增加/减少对应商品的购买数量。如下图所示,一用户id作为key,为每位用户创建一个hash存储结构来存储该用户对应的购物车信息,其中涉及以下操作:
-
添加商品到购物车:
hset key(用户id) filed(商品id) value(商品数量)
-
显示购物车所有商品及每个商品对应数量:
hgetall key
-
增加、减少商品数量:
hincrby key(用户id) field(商品id) 1(数量+1)/-1(数量-1)
-
删除选中的商品:
hdel key(用户id) field(商品id)..
-
获取购物车总量:
hlen key(用户id)
🚨注意:以上的操作并还没有加快购物车页面的呈现速度,因为我们的hash中field存储的是商品的id,要显示商品对应的信息还需要根据商品id去数据库查询后再返回显示,因此我们可以再定义一个field-value对来存储商品信息,添加商品信息时使用hsetnx key(用户id) field2(商品id) value2(商品信息)
列表list
list数据类型是一种简单的有序的字符串列表,保存的数据都是字符串类型,底层采用双向链表存储结构实现。可以实现添加一个元素到列表的左边或者右边,可以从列表的左边或者右边取出元素,可以存储重复的元素,最多可以存储2^32-1个元素。
常见操作
- 添加:
-
lpush key value1 value2..
将元素添加到列表左边(可以一次添加多个),返回值为添加后集合的长度 -
rpush key value
将元素添加到列表右边 -
linsert key before/after "value1" value2
将value2插入到指定的list集合中的value为value1的前面或后面
- 获取:
-
lrange key start end
范围获取 -
lindex key index
获取指定位置的元素 -
llen key
获取list集合中元素的数量
- 获取并移除数据:
lpop key
:删除列表最左边元素,并将元素返回
- rpop key
:删除列表最右边元素,并将元素返回
- 扩展操作
-
blpop key[key ...] timeout
取出集合左边的元素,并设置取出元素对应的存活时间(单位:秒),设置该值后,不会像lpop取出元素后立即移除元素。 -
brpop key[key ...] timeout
-
lrem key count value
删除指定key的集合中指定的value元素,当集合里存储有多个待删除元素,则可以通过count指定删除的数量。
应用场景
例如微信朋友圈点赞,按照点赞顺序显示好友信息。可以以盆友圈文章的id为key,value为点赞好友的信息来实现,涉及以下几个操作:
-
rpush key(文章id) value(好友信息)
点赞 -
lrem key(文章id) count(移除的数量,这里为1) value(好友信息)
取消点赞 -
lrange key(文章id) 0 -1
顺序显示所有点赞信息
集合set
set是string类型的无序不允许重复集合,其底层是通过hashtable实现的。
常见操作
-
存储:
sadd key member [member....]
-
获取set集合中所有元素
smembers key
-
删除set集合中某个元素
srem key value
-
判断set集合中是否存在指定的元素
sismember key value
-
查看指定set集合的所有值
smembers key
-
获取指定set集合中元素的个数
scard key
-
从指定的set集合中随机获一个元素
srandmember key
-
从指定的set集合中随机获n个元素
srandmember key n
-
随机删除指定set集合中某些元素并返回删除的元素
spop key
-
将一个set集合中指定的值移动到另一个set集合中
smove 源集合的key 目标集合的key 源集合中的所要移动的元素
-
获取指定两个集合之间的差集
sdiff key1 key2 [key...]
-
获取指定两个集合之间的交集
sinter key1 key2 [key...]
-
获取指定两个集合之间的并集
sunion key1 key2 [key...]
-
获取指定两个集合之间的并集并保存到另一个新的set集合中
sunionstore 新set集合的key key1 key2 [key...]
应用场景
-
如微信抽奖,使用
sadd key userId
将参与抽奖的用户id保存到set集合中,使用命令smembers key
查看set集合的所有元素,可通过命令spop key 数量
随机抽选出中奖者,使用spop命令后会将已中奖的用户的id从set集合中移除(即可实现已中奖的用户不能再参与下一个奖项的抽奖),而用srandmember key 数量
随机抽取中奖者后,不会将已中奖的用户id从set集合中删除。 -
如获取微博中两个用户对于他们的共同关注🏆,可以将两个用户各自的关注存储到set集合中
sadd 用户id 被关注者信息
,然后通过sinter 用户1Id 用户2Id
求他们两个用户各自关注的大V的交集,就是他们的共同关注。 -
网站访问量统计。
- PV(网站被访问次数,刷新访问量会+1),使用string类型即可实现,调用incr key增加访问量、通过get key获取总访问量。
- UV(网站被用户访问的次数,根据用户id来统计),利用set集合的数据去重功能,使用一个set集合来存储访问网站的用户的id,访问网站时调用sadd userId,当同一个用户多次访问时,当第一次访问后再添加不会成功,从而实现UV统计。
- IP(网站被不同IP访问的次数,IP不变,用户变,IP访问数不变),统计使用set集合的去重,将访问Ip保存到set集合中。
有序集合sortedset
有序集合sortedset,也叫Zset,其和set集合一样都是string类型元素的集合,不允许存储重复的元素,与set不同的是Zset可以通过关联一个Double类型权重的参数score
,将存入到集合中的元素按照该参数score
进行排序,所以Zset是有序的集合。
常见操作
- 存储
zadd key score[依据这个值来排序] value
🚨注意:如果重复添加相同数据,则score值将被覆盖。如下示例:
127.0.0.1:6379> zadd zkey2 2 test
(integer) 1
127.0.0.1:6379> zadd zkey2 3 test
(integer) 0
127.0.0.1:6379> zscore zkey2 test
"3"
127.0.0.1:6379>
-
获取
zrange key start value [withscores]
-
获取集合中某个区间的元素数量
zcount key min max
-
根据score获取指定区间的元素
zrangebyscore key min max [withscores]
-
删除
zrem key value
-
根据排好序的集合删除指定区间的元素
zremrangebyrank key start stop
-
根据score删除指定区间的元素
zremrangebyscore key min max
-
查看指定key的有序集合中元素的个数
zcard key
-
获取指定区间的成员数量
zcount key start end [withscores]
-
将zrange排序的结果反转(倒序)
zrevrange key start end [withscores]
-
求两个或多个集合的交集,并将交集保存到一个新的set集合中
zinterstore destination(存储得出的交集) numberkey(进行交集操作的集合个数) key1 key2 [key...]
-
求两个或多个集合的并集,并将交集保存到一个新的set集合中
zunionstore destination(存储得出的并集) numberkey(进行并集操作的集合个数) key1 key2 [key...]
-
根据score反转集合中某个区间的元素
zrevrangebyscore key max min [withscores]
-
根据score排序获取所有元素如果添加了withscores,则会在获取的每一个元素附带score权重
zrangebyscore key -inf +inf [withscores]
,如下示例:
127.0.0.1:6379> zadd salary 2500 xiaoming (integer) 1
127.0.0.1:6379> zadd salary 2000 xiaohong (integer) 1
127.0.0.1:6379> zadd salary 3000 libai (integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "xiaohong"
2) "xiaoming"
3) "libai"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #获取所有元素并附带score
1) "xiaohong"
2) "2000"
3) "xiaoming"
4) "2500"
5)"libai"
6) "3000"
-
获取集合中指定元素的索引
zrank key 元素member
-
获取集合中元素的权重score值
zscore key member(指定元素)
-
修改集合中指定元素对应的score值
zincrby key increment(增加或减少的值) member(指定元素)
,如下示例
127.0.0.1:6379> zscore zkey1 zvalue2
"3"
127.0.0.1:6379> zincrby zkey1 1 zvalue2
"4"
127.0.0.1:6379> zincrby zkey1 2 zvalue2
"6"
127.0.0.1:6379> zincrby zkey1 -2 zvalue2
"4"
应用场景
如热搜排行版,以文章id为key、搜索量为score进行排序显示
key操作
为key设置指定的有效时间
-
expire key seconds
指定key在多少秒后失效 -
pexpire key milliseconds
指定key在多少豪秒后失效 -
expireat key timestamp
采用时间戳的形式设置失效时间 -
pexpireat key milliseconds-timestamp
采用时间戳+毫秒的的形式设置失效时间
获取key的有效时间
-
ttl key
-
pttl key
将key从时效性转为永久性
persist key
key查询操作
-
keys pattern
-
pattern 的匹配模式
keys *
表示查询所有keys pro*
表示查询所有以pro开头的keykeys am*
表示查询所有以am结尾的keykeys ??pro
表示查询所有前面有任意两个字符且最后以pro结尾的keykeys pro?
表示查询所有以pro开头、最后包含一个任意字符的keykeys no[a|b]pro
表示查询所有以no开头、以pro结尾、中间为a或者b的key
🏁以上就是对Redis简单介绍,如果有错误的地方,还请留言指正,如果觉得本文对你有帮助那就点个赞👍吧😋😻😍