• 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 数据结构详解

  • 相关阅读:
    Windows下安装Redmine
    【精华】Linux/GNOME的小技巧
    Perl简单教程
    【转载】手把手教你配置Windows2003集群(图)
    Windows 7 下如何配置PHP网站运行环境
    常用的PHP数据库操作方法(MYSQL版)
    CentOS上搭建Nginx + Mono 运行 asp.net
    【视频】Win2003 iis 流媒体设置
    【实用】OS X Lion restore Recovery HD Manually 手工创建 OS X Lion 恢复分区
    【小结】CentOS Linux操作系统的设置:
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185063.html
Copyright © 2020-2023  润新知