Redis常用数据类型和对应的命令总结

Redis是一个基于内存的数据库,支持五种基本数据类型,即 string (字符串)、list (列表)、set (集合)、hash (哈 希) 和 zset (有序集合),另外还支持其他的高级功能:Bitmaps、HyperLogLog、GEO、Stream、订阅发布、事务、lua脚本;

Redis 的业务应用范围非常广泛,让我们以掘金技术社区的帖子模块为实例,梳理一下,Redis 可以用在哪些地方?

1、记录帖子的点赞数、评论数和点击数 (hash)。
2、记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。
3、记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
4、记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
5、缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
6、记录帖子的相关文章 ID,根据内容推荐相关帖子 (list)。
7、如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
8、收藏集和帖子之间的关系 (zset)。
9、记录热榜帖子 ID 列表,总热榜和分类热榜 (zset)。
10、缓存用户行为历史,进行恶意行为过滤 (zset,hash)。

Redis的五大基本数据类型的常用命令:

1、String类型是Redis最基本的类型,而且String类型是二进制安全的,可以包含任何数据,比如图片或者序列化的对象。String类型最大可以存储512MB数据

常用命令:

#设置一个key valuse
set key value

#获取一个key
get key

#将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
setex key seconds value 

#只有在 key 不存在时设置 key 的值,用于实现分布式锁的关键
setnx key value

#key自曾1 
incr key 

#加上指定的值
incrby key increment 

#自减1
decr key 

#自减指定的值
decrby key decrement 
#INCR等指令本身就具有原子性操作,所以我们完全可以利用redis的 INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。 
#注意INCR命令的最大值是Long.MAX_VALUE

2、Hash是一个String类型的field(字段)和value(值)的映射表,Hash特别适合用于存储对象,每个 Hash 可以存储 2^32 - 1 键值对(40多亿)

常用命令:

#设置hash key对应的field的value
hset key field value

#获取hash key对应的field的value
hget key field

#删除hash key对应的field的value
hdel key field

#判断hash key是否有field
hexists key field

#设置hash key对应field的value(如field已经存在,则失败)
hsetnx key field value

#设置hash key对应的field增长increment,原子性的,没有减少,increment可以设置负值
hincrby key field increment

#批量设置
hmset key field1 value1 field2 value2...

#批量获取
hmget key field1 field2...

#返回hash key对应所有的field和value,小心使用,注意大数据
hgetall key 

#Hash类型不能单独控制某个filed的过期时间

3、List是Redis的简单String类型的列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以存储 2^32 - 1 个元素 (40亿)。

常用命令:

#从列表右端插入值(1-N个)
rpush key value1 value2 ... valueN

#从列表左端插入值(1-N个)          
lpush key value1 value2 ... valueN

#在list指定的值前插入newValue         
linsert key before value newValue

#在list指定的值后插入newValue           
linsert key after value newValue  

#从列表左侧弹出一个value          
lpop key 

#从列表右侧弹出一个value                                   
rpop key

#获取列表指定索引范围所有value
lrange key start end(包含end)  

#获取列表指定索引的value             
lindex key index                            

#lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时
blpop key timeout                           

#rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不超时
brpop key timeout 

#list我们通过一些命令的组合可以实现一些特殊的数据结构
lpush+lpop=Stack(栈--先进后出)

lpush+rpop=Queue(队列--先进先出)

lpush+brpop=Message Queue(消息队列)

4、Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。一个集合中最大可以存储 2^32 - 1个元素

常用命令:

扫描二维码关注公众号,回复: 12684436 查看本文章
#向集合key添加value(如果value已经存在,添加失败)
sadd key value

#将集合key中的value移除掉                
srem key value

#计算集合大小               
scard key
	
#判断value是否在集合中		    
sismember key value

#从集合中随机挑count个元素,不破坏集合的结构		
srandmember key count

#从集合中随机弹出一个元素,弹出后集合中没有这个元素了	
spop key

#获取集合所有元素,无序,小心使用,注意大数据						
smembers key

sdiff           差集
sinter          交集
sunion          并集

#使用场景:
#1、在一些抽奖活动中,就可以用Redis的集合来实现,使用spop(随机弹出)把已经中奖的用户弹出
#2、在社交网络中,常用的如点赞,踩等功能也可以用集合来实现
#3、社交网络中,共同关注的好友可以用集合的交集实现

5、Redis 的zset有序集合和集合一样也是 String 类型元素的集合,不允许重复的成员。不同的是每个元素都会关联一个score分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数却可以重复。一个集合中最大可以存储 2^32 - 1个元素。

常用命令:

#添加score和value
zadd key score value(可以是多对)

#删除元素				
zrem key value(可以是多个)

#返回元素的分数                 					
zscore key value

#增加或减少元素的分数						
zincrby key increScore value

#返回元素的总个数				       
zcard key			

#返回指定索引范围内的升序元素[分值]
zrange key start end [withscores]

#返回指定分数范围内的长序元素[分值]			
zrangebyscore key minScore maxScore

#返回有序集合内在指定分数范围内的个数			
zcount len minScore maxScore
	
#删除指定排名内的升序元素				
zremrangebyrank key start end

#删除指定分数内的升序元素					
zremrangebyscore key minScore maxScore

#获取有序集合中从高到低的排名 		
zrevrank

#从高到低排名后获取一定范围的值 				
zrevrange

#按score从高到低排名的结果				
zrevrangebyscore

#对两个有序集合的交集进行运算,并保存		
zinterstore

#对两个有序集合的并集进行运算,并保存				
zunionstore

Redis的使用注意事项:

  • 1.key尽量精简,用业务打头避免冲突,用冒号分割,如 oom:api:orderid
  • 2.建议key设置过期时间,也注意要打散过期时间,避免同一时间大量key过期
  • 3.拒绝bigValue
  • 4.String类型在10kb以内,集合元素不要超过5000个
  • 5.关注O(n)时间复杂度的命令的n大小,避免bigkey的遍历

猜你喜欢

转载自blog.csdn.net/qq_33505611/article/details/113417064
今日推荐