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

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185063.html
Copyright © 2020-2023  润新知