请选择 进入手机版 | 继续访问电脑版
微信扫一扫 分享朋友圈

已有 314 人浏览分享

开启左侧

redis的5种数据结构和基本操作

[复制链接]
314 0
本帖最后由 孤独剑客 于 2019-9-22 16:11 编辑

1.字符串(string)
1.1设置值
s[mw_shl_code=cpp,true]et key value [ex seconds] [px milliseconds] [nx|xx][/mw_shl_code]
例如:
[mw_shl_code=cpp,true]
127.0.0.1:6379> set hello world
OK[/mw_shl_code]
1.2获取值
[mw_shl_code=csharp,true]127.0.0.1:6379> get hello
"world"[/mw_shl_code]
字符串类型的内部编码有3种:

int:8个字节的长整型。
embstr:小于等于39个字节的字符串。
raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
2.哈希(hash)

hash由多个field构成,适合存储拥有多个属性的对象。

2.1 设置值
[mw_shl_code=cpp,true]hset key field value[/mw_shl_code]
例如添加一个名字为tom的用户,user为key,name为field

[mw_shl_code=cpp,true]127.0.0.1:6379> hset user name tom
(integer) 1[/mw_shl_code]
再为这个hash添加一个名为age的field
[mw_shl_code=cpp,true]
127.0.0.1:6379> hset user age 13
(integer) 1[/mw_shl_code]
2.2 获取值
h[mw_shl_code=cpp,true]get key field[/mw_shl_code]
例如获取用户的名字

[mw_shl_code=cpp,true]127.0.0.1:6379> hget user name
"tom"[/mw_shl_code]
获取用户的年龄

[mw_shl_code=cpp,true]127.0.0.1:6379> hget user age
13[/mw_shl_code]
3.list

list是一个类似数组的有序线性结构,允许存储重复元素。

3.1添加操作
从右边添加元素
[mw_shl_code=cpp,true]rpush key value [value ...][/mw_shl_code]
从右边向左插入三个元素a、b、c示例:
[mw_shl_code=cpp,true]127.0.0. 1:6379> rpush listkey c b a
(integer) 3[/mw_shl_code]
此时名为listkey的list存储的元素如下:

[mw_shl_code=cpp,true]127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "b"
3) "a"[/mw_shl_code]
从左边添加元素
[mw_shl_code=cpp,true]lpush key value [value ...][/mw_shl_code]
从左向右添加元素示例:
[mw_shl_code=cpp,true]127.0.0. 1:6379> lpush listkey c b a[/mw_shl_code]
(integer) 3
3.2查找元素
获取指定索引下标元素
[mw_shl_code=cpp,true]lindex key index[/mw_shl_code]
获取列表长度
[mw_shl_code=cpp,true]127.0.0.1:6379> llen listkey[/mw_shl_code]
(integer) 4
3.3删除元素
将列表最左侧的一个元素弹出
[mw_shl_code=cpp,true]lpop listkey[/mw_shl_code]
将列表最右侧的一个元素弹出
[mw_shl_code=cpp,true]rpop listkey[/mw_shl_code]
其余操作可参考这张命令表:
4.集合(set)
set可以用来保存多个字符串元素,无序,不允许重复。

4.1添加元素
[mw_shl_code=cpp,true]
sadd key element [element ...]

127.0.0.1:6379> sadd myset a b c
(integer) 3

127.0.0.1:6379> sadd myset a b
(integer) 0[/mw_shl_code]4.2 删除元素
srem key element [element ...]
返回删除元素个数

1[mw_shl_code=c,true]27.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> srem myset hello
(integer) 0[/mw_shl_code]4.3 计算元素个数
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用
Redis内部的变量,例如:

[mw_shl_code=cpp,true]
127.0.0.1:6379> sismember myset c
(integer) 1[/mw_shl_code]否在集合中
sismember key element
如果给定元素element在集合内返回1,反之返回0,例如:

127.0.0.1:6379> sismember myset c
(integer) 1
4.5 从集合随机弹出元素
spop key
spop操作可以从集合中随机弹出一个元素,例如下面代码是一次spop
后,集合元素变为"d b a":

[mw_shl_code=cpp,true]127.0.0.1:6379> spop myset
"c"
127.0.0.1:6379> smembers myset
1) "d"
2) "b"
3) "a"[/mw_shl_code]
srandmember和spop都是随机从集合选出元素,两者不同的是spop命令
执行后,元素会从集合中删除,而srandmember不会。

4.6 获取所有元素
smembers key

[mw_shl_code=cpp,true]127.0.0.1:6379> smembers myset
1) "d"
2) "b"
3) "a"[/mw_shl_code]
smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻
塞Redis的可能性,建议使用sscan来完成。

5.有序集合(zset)
有序集合在set上增加了排序的特性,依然不允许重复元素。
有序集合排序靠的不是索引下标,而是每个元素的分数(score)。zset十分适合用来做排行榜。
5.1添加元素
[mw_shl_code=c,true]127.0.0.1:6379> zadd user:ranking 251 tom
(integer) 1[/mw_shl_code]
5.2 计算成员个数
127.0.0.1:6379> zcard user:ranking
(integer) 5
5.3 计算成员排名
zrank是从分数从低到高返回排名,zrevrank反之。例如下面操作中,tom
在zrank和zrevrank分别排名第5和第0(排名从0开始计算)。
[mw_shl_code=cpp,true]
127.0.0.1:6379> zrank user:ranking tom
(integer) 5
127.0.0.1:6379> zrevrank user:ranking tom[/mw_shl_code]
(integer) 0
5.3 删除成员
[mw_shl_code=cpp,true]127.0.0.1:6379> zrem user:ranking mike[/mw_shl_code]
(integer) 1
5.4 返回指定分数范围的成员
[mw_shl_code=cpp,true]zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count][/mw_shl_code]

其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如
下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个
成员的分数。[limit offset count]选项可以限制输出的起始位置和个数:
[mw_shl_code=cpp,true]
127.0.0.1:6379> zrangebyscore user:ranking 200 tinf withscores
1) "frank"
2) "200"
3) "tim"
4) "220"
127.0.0.1:6379> zrevrangebyscore user:ranking 221 200 withscores
1) "tim"
2) "220"
3) "frank"
4) "200"[/mw_shl_code]


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门资讯
网友晒图
图文推荐
  • 联系我们
  • 邮箱:admin@c0ks.com(请把#改成@)
  • 电话:18530790808
  • QQ客服 1031180668
  • 工作时间:周一至周五(早上9点至下午5点)
  • 微信二维码

  • 扫描访问手机版

Archiver|手机版|小黑屋|从零开始

GMT+8, 2020-5-31 15:13 , Processed in 0.101187 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

  • QQ: 1031180668

    客服电话

    18530790808

    电子邮件

    admin@c0ks.com

    在线时间:8:00-16:00