• 【Redis学习之五】Redis数据类型:列表和散列


    环境
      虚拟机:VMware 10
      Linux版本:CentOS-6.5-x86_64
      客户端:Xshell4
      FTP:Xftp4
      jdk8
      redis-2.8.18

    一、列表
      基于Linked List实现
      元素是字符串类型
      列表头尾增删快,中间增删慢,增删元素是常态
      元素可以重复出现
      最多包含2^32-1元素

    列表的索引
    从左至右,从0开始
    从右至左,从-1开始



    队列:L/R R/L 从两头操作就是队列
    栈: L/L R/R 一直从一个方向操作就是栈
    数组:LINDEX LSET
    阻塞:BL BR

    命令说明
    B block 块,阻塞
    L left 左
    R right 右
    X exist 存在

    (1)队列赋值
    左右或者头尾压入元素
    LPUSH key value [value ...]
    LPUSHX key value
    RPUSH key value [value ...]
    RPUSHX key value

    (2)队列取值
    左右或者头尾弹出元素
    LPOP key
    RPOP key

    从一个列表尾部弹出元素压入到另一个列表的头部
    RPOPLPUSH source destination

    返回列表中指定范围元素
    LRANGE key start stop
    LRANGE key 0 -1 表示返回所有元素
    PCS103:6379> lrange list 0 -1
    fdsf
    121
    dsj

    (3)数组操作
    获取指定位置的元素
    LINDEX key index

    设置指定位置元素的值
    LSET key index value

    列表长度
    LLEN key

    (4)从列表头部开始删除值等于value的元素count次,LIST 可以重复出现
    LREM key count value
    count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
    count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
    count = 0 : 移除表中所有与 value 相等的值

    (5)去除指定范围 外 元素
    LTRIM key start stop
    举例
    RPUSH listkey c abc c ab 123 ab bj ab redis list
    LTRIM listkey 0 -1
    LTRIM listkey 1 -1
    LTRIM listkey 1 10000
    微博的评论最后500条
    LTRIM u1234:forumid:comments 0 499

    (6)插入值
    在列表中某个存在的值(pivot)前或后插入元素
    LINSERT key BEFORE|AFTER pivot value
    key和pivot不存在,不进行任何操作
    举例
    RPUSH lst Clojure C Lua
    LINSERT lst AFTER C Python
    LINSERT lst BEFORE C Ruby

    (7)阻塞
    如果弹出的列表不存在或者为空,就会阻塞
    超时时间设置为0,就是永久阻塞,直到有数据可以弹出
    如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务
    左右或者头尾阻塞弹出元素
    BLPOP key [key ...] timeout
    BRPOP key [key ...] timeout

    从一个列表尾部阻塞弹出元素压入到另一个列表的头部
    BRPOPLPUSH source destination timeout


    二、散列(Hash)
    由field和关联的value组成的map键值对
    field和value是字符串类型
    一个hash中最多包含2^32-1键值对

    (1)赋值
    设置单个字段
    HSET key field value
    HSETNX key field value
    key的filed不存在的情况下执行,key不存在直接创建

    设置多个字段
    HMSET key field value [field value ...]

    (2)取值
    返回字段值
    HGET key field

    返回多个字段值
    HMGET key field [field ...]

    返回所有的键值对
    HGETALL key

    返回所有字段名
    HKEYS key

    返回所有值
    HVALS key

    返回字段个数
    HLEN key

    判断字段是否存在
    HEXISTS key field
    key或者field不存在,返回0

    (3)计算
    在字段对应的值上进行整数的增量计算
    HINCRBY key field increment

    在字段对应的值上进行浮点数的增量计算
    HINCRBYFLOAT key field increment

    (4)删除
    删除指定的字段
    HDEL key field [field ...]

    举例
    HINCRBY numbers x 100
    HINCRBY numbers x -50
    HINCRBYFLOAT numbers x 3.14
    HDEL numbers x

    用途
    节约内存空间
    每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
    所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算

    不适合hash的情况
    使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
    使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面

    案例
    微博的好友关注
    用户ID为key,Field为好友ID,Value为关注时间
    user:1000 user:606 20150808
    xz pl 2011 zs 1949
    用户维度统计
    统计数包括:关注数、粉丝数、喜欢商品数、发帖数
    用户为Key,不同维度为Field,Value为统计数
    比如关注了5人
    HSET user:100000 follow 5
    HINCRBY user:100000 follow 1

  • 相关阅读:
    bzoj4195 [Noi2015]程序自动分析
    bzoj4236 JOIOJI hash 模拟
    bzoj1012 [JSOI2008]最大数maxnumber
    day 4 名片管理系统 -函数版
    day 3 局部变量 全局变量
    day 2 函数的嵌套
    day1 函数 (独立功能代码块)
    day 14 元组
    day 13 字典dict 操作
    day 12 列表字典 补充
  • 原文地址:https://www.cnblogs.com/cac2020/p/10524852.html
Copyright © 2020-2023  润新知