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
原文地址:https://www.cnblogs.com/64Byte/p/13204934.html