zoukankan      html  css  js  c++  java
  • Redis数据结构以及操作

    转载https://www.cnblogs.com/ryxiong-blog/articles/11134233.html

    一、redis数据结构和基本操作

    redis是一种高级的key:value存储系统,其中value支持五种数据类型

    • 字符串(strings)

    • 列表(lists)

    • 集合(sets)

    • 有序集合(sorted sets)--也叫zset

    • 哈希数据(hashes)

    基本命令

    • keys *:查看所有key

    • type key:查看key类型

    • expire key seconds:设置某个键的过期时间

    • ttl key:查看key过期剩余时间,-2表示key已经不存在了

    • persist:取消key的过期时间,-1表示key存在,没有过期时间

    • exists key:判断key存在,存在返回1,否则0

    • del keys:删除key,可以删除多个

    • dbsize:计算key的数量

    127.0.0.1:6379> set hobby prography
    OK
    127.0.0.1:6379> expire hobby 10000  # 设置过期时间
    (integer) 1
    127.0.0.1:6379> ttl hobby  # 查看键的过期时间
    (integer) 9989
    127.0.0.1:6379> persist hobby  # 取消键hobby的过期时间
    (integer) 1
    127.0.0.1:6379> exists name  # 判断键name是否存在
    (integer) 1
    127.0.0.1:6379> del hobby  # 删除键值对hobby
    (integer) 1
    127.0.0.1:6379> dbsize  # 查看所有键值对数量
    (integer) 4

    二、strings的操作

    strings类型的方法

    • set:设置key

    • get:获取key

    • append:追加string

    • mset:设置多个键值对

    • mget:获取多个键值对

    • del:删除key

    • incr:递增+1

    • decr:递减-1

    使用方法实例

    [root@superdesktop ~]# redis-cli
    127.0.0.1:6379> set name ryxiong
    OK
    127.0.0.1:6379> get name  # 获取键name的值
    "ryxiong"
    127.0.0.1:6379> append name dsb  # 给键name的值添加内容
    (integer) 10
    127.0.0.1:6379> get name  # 获取键name的值
    "ryxiongdsb"
    127.0.0.1:6379> mset age 25 gender male  # 设置多个键值对
    OK
    127.0.0.1:6379> mget name age gender  # 获取多个键的值
    1) "ryxiongdsb"
    2) "25"
    3) "male"
    127.0.0.1:6379> set likes 1
    OK
    127.0.0.1:6379> incr likes  # 点赞数+1
    (integer) 2
    127.0.0.1:6379> decr likes  # 点赞数-1
    (integer) 1

    三、list类型

    list类型方法

    • lpush:从列表左边插入元素,可以为多个

    • rpush:从列表右边插入元素,可以为多个

    • lrange:获取一定长度的元素 ,lrange key start stop

    • ltrim:截取一定长度列表,注意截取范围是前闭后闭

    • lpop:删除最左边一个元素

    • rpop:删除最右边一个元素

    • lpushx/rpushx:key存在则添加值,不存在不处理

    list操作实例

    127.0.0.1:6379> lpush queue 'alex' 'egon' 'wusir'  # 插入一个list
    (integer) 3
    127.0.0.1:6379> llen queue
    (integer) 3
    127.0.0.1:6379> lrange queue 0 -1  # 查看list的所有元素
    1) "wusir"
    2) "egon"
    3) "alex"
    127.0.0.1:6379> rpush queue 'evaj'
    (integer) 4127.0.0.1:6379> ltrim queue 0 2  # 截取列表的0-2,注意前后都闭合
    OK
    127.0.0.1:6379> lrange queue 0 -1
    1) "wusir"
    2) "egon"
    3) "alex"127.0.0.1:6379> lpop queue  # 删除list左边第一个
    "wusir"
    127.0.0.1:6379> rpop queue  # 删除list右边第一个
    "alex"
    127.0.0.1:6379> lrange queue 0 -1
    1) "egon"127.0.0.1:6379> lpushx queue 'dsb'  # 有dsb不添加,没有就添加
    (integer) 2
    127.0.0.1:6379> lrange queue 0 -1
    1) "dsb"
    2) "egon"

    四、sets集合类型

    redis的集合,是一种无序的集合,集合中的元素没有先后顺序。

    集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。

    sets类型的方法:

    • sadd/srem:添加/删除 元素

    • sismember:判断是否为set的一个元素

    • smembers:返回集合所有的成员

    • sdiff:返回一个集合和其他集合的差异

    • sinter:返回几个集合的交集

    • sunion:返回几个集合的并集

    sets操作实例

    127.0.0.1:6379> sadd zoo wusir egon yuanhao  # 设置一个集合zoo
    (integer) 3
    127.0.0.1:6379> sadd zoo2 egon evaj alex  # zoo2
    (integer) 3127.0.0.1:6379> sismember zoo egon  # 判断egon是否是zoo的成员
    (integer) 1
    127.0.0.1:6379> sadd zoo chao  # 给zoo添加一个成员chao
    (integer) 1
    127.0.0.1:6379> smembers zoo  # 查看zoo的所有成员
    1) "chao"
    2) "yuanhao"
    3) "egon"
    4) "wusir"127.0.0.1:6379> sdiff zoo zoo2  # 求zoo和zoo2的差集
    1) "wusir"
    2) "yuanhao"
    3) "chao"127.0.0.1:6379> sinter zoo zoo2  # 求zoo和zoo2的交集
    1) "egon"127.0.0.1:6379> sunion zoo zoo2  # 求zoo和zoo2的并集
    1) "chao"
    2) "yuanhao"
    3) "egon"
    4) "alex"
    5) "evaj"
    6) "wusir"

    五、ZSet有序集合

    • zadd:  在set基础上加一个score值,之前set 是 k1 v1 v2 v3 v4,现在zset 是k1 score1 v1 score2 v2. zadd zset 60 v1 70 v2 80 v3 90 v4
    • zrange:  根据索引来显示V. ZRANGE zset 0 -1,同时要是想显示出score,可以在后面追加一个withscores
    • zrangebyscore:  显示一个分数的范围. zrangebyscore zset 70 90
    • limit:  表示在zrangebyscore分数范围的元素再次进行分页显示. zrangebyscore zset 60 90 limit 2 2就是分2页显示第二页
    • zrem:  某score下对应的value值,作用是删除元素. zrem zset v3 就是删除v3 元素
    • zcard:  表示查询V的个数
    • zcount:  表示在一个范围的个数. ZOUNT zset 60 80
    • zrank:  表示获取v对应的scope的下标. ZRANK zset v3
    • zscre:  表示当前V对应的score值 . ZSCORE zset v3
    • zrevrank:  表示获取V对应的score下标的逆序. ZREVRANK zset v3
    • zrevrange:  表示根据索引显示出来的元素进行逆序显示

    有序集合都是以z开头,一般用来保存需要排序的数据,如排行榜,成绩,工资等。

    实例,排序学生的成绩

    127.0.0.1:6379> ZADD mid_test 70 "alex"  # 添加alex 70到成绩的有序集合中
    (integer) 1
    127.0.0.1:6379> ZADD mid_test 80 "wusir"
    (integer) 1
    127.0.0.1:6379> ZADD mid_test 99 "yuyu"

    排行榜,zreverange倒序,zrange正序。

    127.0.0.1:6379> ZREVRANGE mid_test 0 -1 withscores
    1) "yuyu"
    2) "99"
    3) "wusir"
    4) "80"
    5) "xiaofneg"
    6) "75"
    7) "alex"
    8) "70"
    127.0.0.1:6379> ZRANGE mid_test 0 -1 withscores
    1) "alex"
    2) "70"
    3) "xiaofneg"
    4) "75"
    5) "wusir"
    6) "80"
    7) "yuyu"
    8) "99"

    移除有序集合mid_test的成员xiaofeng

    127.0.0.1:6379> ZREM mid_test xiaofneg
    (integer) 1
    127.0.0.1:6379> ZRANGE mid_test 0 -1 withscores
    1) "alex"
    2) "70"
    3) "wusir"
    4) "80"
    5) "yuyu"
    6) "99"

    返回有序集合mid_test的基数

    127.0.0.1:6379> ZCARD mid_test
    (integer) 3

    返回成员的score值

    127.0.0.1:6379> ZSCORE mid_test alex
    "70"

    六、hashes哈希数据结构

    哈希结构就是 :k1 -> k1 : v1 如同字典 套字典 { k1 : { k2: v2 } } ,取出v2 必须 k1,取出k2

    hashes即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。

    hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。

    • hset:设置散列值

    • hget:获取散列值

    • hmset:设置多对散列值

    • hmget:获取多对散列值

    • hsetnx:如果散列已经存在,则不设置(防止覆盖key)

    • hkeys:返回所有keys

    • hvals:返回所有values

    • hlen:返回散列包含域(field)的数量

    • hdel:删除散列指定的域(field)

    • hexists:判断是否存在

    哈希数据使用实例

    127.0.0.1:6379> hset ryxiong name ryxiong
    (integer) 1
    127.0.0.1:6379> hset ryxiong age 18
    (integer) 1
    127.0.0.1:6379> hset ryxiong gender male
    (integer) 1
    127.0.0.1:6379> hget ryxiong name
    "ryxiong"
    127.0.0.1:6379> hmset haiqing name haiqing gender female
    OK
    127.0.0.1:6379> hkeys ryxiong
    1) "name"
    2) "age"
    3) "gender"
    127.0.0.1:6379> hvals ryxiong
    1) "ryxiong"
    2) "18"
    3) "male"
    127.0.0.1:6379> hmget ryxiong name age
    1) "ryxiong"
    2) "18"
    127.0.0.1:6379> hsetnx ryxiong tall 175
    (integer) 1
    127.0.0.1:6379> hlen ryxiong
    (integer) 4
    127.0.0.1:6379> hdel ryxiong tall
    (integer) 1
    127.0.0.1:6379> hkeys ryxoing
    (empty list or set)
    127.0.0.1:6379> hlen ryxiong
    (integer) 3
    127.0.0.1:6379> hkeys ryxiong
    1) "name"
    2) "age"
    3) "gender"
    127.0.0.1:6379> hexists ryxiong name
  • 相关阅读:
    Codeforces Gym 101142C:CodeCoder vs TopForces(搜索)
    L2-011. 玩转二叉树
    zoj 2976 Light Bulbs(暴力枚举)
    ZOJ 2975 Kinds of Fuwas(暴力+排列组合)
    ZOJ-2972-Hurdles of 110m(线性dp)
    ZOJ 2971 Give Me the Number (模拟,字符数组的清空+map)
    zoj 2966 Build The Electric System(最小生成树)
    ZOJ 2965 Accurately Say "CocaCola"!(预处理)
    HDU 3452 Bonsai(树形dp)
    zoj 3212 K-Nice(构造)
  • 原文地址:https://www.cnblogs.com/64Byte/p/13204934.html
Copyright © 2011-2022 走看看