Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

数据类型 使用场景
string 字符串(XML/Json)、数字、二进制,最简单的 k:v 场景
hash 一个string类型的field和value的映射表
list 有序列表,可以用来保存粉丝列表,文章评论表之类的。用lrange命令还可以分页读取列表。
set 无序集合,可以用来做全局去重,或者做交并操作
sorted set 有序的 set,即可以去重还可以排序,比如可以做排行榜

字符串 string

字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB。

基本数据结构-string

# 设值命令:
set age 23 // 设置一个值
set age 23 ex 10  //10秒后过期  px 10000 毫秒过期
setnx name test  //不存在键name时,返回1设置成功;存在的话失败0
set age 25 xx    //存在键age时,返回1成功

# 获值命令:
get age //存在则返回value, 不存在返回nil
 
#批量设值:
mset country china city beijing
# 批量获取:
mget country city address //返回china  beigjin, address为nil
# 注意:若没有mget命令,则要执行n次get命令


# 计数
incr age // 必须为整数自加1,非整数返回错误,无age键从0自增返回1
decr age // 整数age减1
incrby age 2 // 整数age+2
decrby age 2// 整数age -2
incrbyfloat score 1.1 // 浮点型score+1.1

# 追加
append追加指令:
    set name hello; 
    append name world //追加后成helloworld

# 字符串长度:
   set hello “世界”;
   strlen hello//结果6,每个中文占3个字节

# 截取字符串:
   set name helloworld ; 
   getrange name 2 4//返回 llo

哈希 hash

哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象

基本数据结构——hash

命令  hset key field value
设值:hset user:1 name james         //成功返回1,失败返回0
取值:hget user:1 name              //返回james
删值:hdel user:1 age               //返回删除的个数
计算个数:hset user:1 name james; hset user:1 age 23; 
hlen user:1               //返回2,user:1有两个属性值
批量设值:hmset user:2 name james age 23 sex boy //返回OK
批量取值:hmget user:2 name age sex   //返回三行:james 23 boy
判断field是否存在:hexists user:2 name //若存在返回1,不存在返回0
获取所有field: hkeys user:2            // 返回name age sex三个field
获取user:2所有value:hvals user:2     // 返回james 23 boy
获取user:2所有field与value:hgetall user:2 //name age sex james 23 boy值
增加1:hincrby user:2 age 1      //age+1
hincrbyfloat user:2 age 2   //浮点型加2

比如有一张数据库的表,将表中数据存储到redis中,就可以使用hash。

id	name	age	city
1		jack	23	NULL
2		james	18	shanghai

hash 存储数据库数据

三种实现用户信息存储,优缺点对比

1,原生:
			set user:1:name james;
			set user:1:age  23;
			set user:1:sex boy;
      优点:简单直观,每个键对应一个值
      缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

2,将对象序列化存入redis
      set user:1 serialize(userInfo);
      优点:编程简单,若使用序列化合理内存使用率高
      缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis

3,使用hash类型:
      hmset user:1 name james age 23 sex boy
   		优点:简单直观,使用合理可减少内存空间消耗
   		缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize(userInfo);

列表 list

用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素。因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复。

基本数据结构-list

队列/堆栈 :链表可以从表头和表尾追加和移除元素,结合使用rpush/rpop/lpush/lpop四条指令,可以将链表作为队列或堆栈使用,左向右向进行都可以。

# 添加命令:
rpush james c b a //从右向左插入cba, 返回值3
lrange james 0 -1 //从左到右获取列表所有元素 返回 c b a
lpush key c b a //从左向右插入cba
linsert james before b teacher //在b之前插入teacher, after为之后,使用
lrange james 0 -1 查看:c teacher b a

# 查找命令:
lrange key start end //索引下标特点:从左到右为0到N-1
lindex james -1 //返回最右末尾a,-2返回b
llen james        //返回当前列表长度
lpop james       //把最左边的第一个元素c删除
rpop james      //把最右边的元素a删除

集合 set

用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;

基本数据结构-set

exists user    //检查user键值是否存在
sadd user a b c//向user插入3个元素,返回3
sadd user a b  //若再加入相同的元素,则重复无效,返回0
smember user //获取user的所有元素,返回结果无序
srem user a   //返回1,删除a元素 
scard user    //返回2,计算元素个数
# 使用场景
标签,社交,查询有共同兴趣爱好的人,智能推荐
  使用方式:
  给用户添加标签:
  sadd user:1:fav basball fball pq
  sadd user:2:fav basball fball   
  ............
 
  或给标签添加用户
  sadd basball:users user:1 user:2
  sadd fball:users user:1 user:2
  ........
 
  计算出共同感兴趣的人:
  sinter user:1:fav user2:fav

有序集合 zset

常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员。

基本数据结构-zset

与LIST和SET对比:

数据结构 是否允许元素重复 是否有序 有序实现方式 应用场景
列表 索引下标 时间轴,消息队列
集合 标签,社交
有序集合 分值 排行榜,点赞数
指令:   
   zadd key score member [score member......]
   zadd user:zan 200 james //james的点赞数1, 返回操作成功的条数1
   zadd user:zan 200 james 120 mike 100 lee// 返回3

   zadd test:1 nx 100 james   //键test:1必须不存在,主用于添加
   zadd test:1 xx incr 200 james   //键test:1必须存在,主用于修改,此时为300
   zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1
   
   zrange test:1 0 -1 withscores  //查看点赞(分数)与成员名
   
   zcard test:1     //计算成员个数, 返回1

排名场景:
	zadd user:3 200 james 120 mike 100 lee//先插入数据
	zrange user:3 0 -1 withscores //查看分数与成员
	zrank user:3 james  //返回名次:第3名返回2,从0开始到2,共3名
  zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前

应用场景

排行榜系统,如视频网站需要对用户上传的视频做排行榜
   点赞数:
           zadd user:1:20180106 3 mike  //mike获得3个赞
   再获一赞:
           zincrby user:1:20180106 1 mike  //在3的基础上加1
   用户作弊,将用户从排行榜删掉:
           zrem user:1:20180106 mike
   展示赞数最多的5个用户:
           zrevrangebyrank user:1:20180106  0  4 
   查看用户赞数与排名:
           zscore user:1:20180106 mike   zrank user:1:20180106 mike

扩展文章

通俗易懂的Redis数据结构基础教程

Redis 数据结构详解

原文地址:https://www.cnblogs.com/shuiyj/p/13185063.html