文档章节

Redis常用数据结构

o
 osc_n6euf5h6
发布于 2019/03/19 17:25
字数 1599
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

  Redis常用数据结构包括字符串(strings),列表(lists),哈希(hashes),集合(sets),有序集合(sorted sets)。

  redis的key最大不能超过512M,可通过redis-cli config get xxx获取某个参数配置,如获取redis最大内存,redis-cli config get maxmemory。可通过redis-cli config set xxx来设置某个参数的值,如:redis-cli config set maxmemory 400M

  字符串(Strings)

  Redis最简单的数据结构,通过get/set/进行查询和设置参数,set时,吐过key之前已存在,则默认会替换,value最大值不能超过512M,可以通过nx来设置不覆盖之前已存在的value。set key value nx,如果key已存在,返回空,value还是修改之前的值,如果value是整数,则可通过incr等命令进行自增,可通过mset,mget命令添加或查询多组命令。  

  列表(Lists)

  Redis列表是通过链表(linked list)来实现的,插入速度非常快,官网介绍,使用lpush向一个只有10个元素的列表插入元素与向一个有一千万个元素的列表插入元素的速度是相同的,但是查询速度比较慢,这和java中链表的特点一致(插入删除快,查找修改慢)。redis以链表实现列表list的一个原因为在数据库中向一个非常长的量表中快速插入数据是非常重要的。另外,可以在恒定时间内或者指定范围内的数据。当需要快速访问一个非常大的集合中的元素时,可以通过使用另外一种数据结构,sorted set。list常用的命令有lpush,rpush,rpop,lpop,lrange,ltrim,llen等,ltrim与lrange类型,其只保留指定范围内的元素,范围之外的元素将被删除,从0开始,包含起始和结束元素。

  如果要获取最新的五条数据,则可以通过lrange list 0 4来处理,这在有些情况下是很有用的。

127.0.0.1:6379> LPUSH list aa bb cc dd ee ff gg kk ll mm
(integer) 10
127.0.0.1:6379> LRANGE list 0 4
1) "mm"
2) "ll"
3) "kk"
4) "gg"
5) "ff"
127.0.0.1:6379>

  lrange中元素位置也可以使用负数,如想要获取最早的5条数据,可以通过lrange list -5 -1

127.0.0.1:6379> LRANGE list -5 -1
1) "ee"
2) "dd"
3) "cc"
4) "bb"
5) "aa"
127.0.0.1:6379>

  如果只保留最新的5条数据,则可以使用ltrim,不在前五条的数据将被删除,节省内存空间

127.0.0.1:6379> LPUSH num 0 1 2 3 4 5 6 7 8 9
(integer) 10
127.0.0.1:6379> LTRIM num 0 4
OK
127.0.0.1:6379> LRANGE num 0 10
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
127.0.0.1:6379>

  可以使用lpush与rpop或者rpush与lpop模拟队列,先进先出

127.0.0.1:6379> LPUSH ls01  11 22 33
(integer) 3
127.0.0.1:6379> RPOP ls01
"11"
127.0.0.1:6379> 
127.0.0.1:6379> RPUSH ls02 11 22 33
(integer) 3
127.0.0.1:6379> LPOP ls02
"11"
127.0.0.1:6379>

  可以使用lpush与lpop或者rpush与rpop模拟栈,先进后出

127.0.0.1:6379> LPUSH ls03 11 22 33
(integer) 3
127.0.0.1:6379> LPOP ls03
"33"
127.0.0.1:6379> 
127.0.0.1:6379> RPUSH ls04 11 22 33
(integer) 3
127.0.0.1:6379> RPOP ls04
"33"
127.0.0.1:6379>

  使用rpush,brpop,lpush,blpop可以实现生产者消费者模式,当获取病毒奥信息,则等待,知道超时,blpop key timeout,等到timeout时间还未获取到数据,则结束命令

  哈希(Hashes)

  类似于java中的map,可用于存储一个对象的属性,常用命令有hset,hget,hgetall,hmset,hdel,hlen

  集合(Sets)

  无序数据,不允许重复,可以执行多个集合的交集,并集和差集,常用的命令有sadd,sismember,smembers,sinter交集,sunion并集,sdiff差集,spop随机获取并移除元素

  sunionstore拷贝集合到一个新的集合中,语法结构:sunionstore newset oldset,

127.0.0.1:6379> SADD set 1 2 3
(integer) 3
127.0.0.1:6379> SUNIONSTORE set01 set
(integer) 3
127.0.0.1:6379>

 若将oldset放到前面,且newset为空,则会清空oldset

127.0.0.1:6379> sadd set 1 2 3
(integer) 3
127.0.0.1:6379> SUNIONSTORE set set001
(integer) 0
127.0.0.1:6379> SMEMBERS set
(empty list or set)
127.0.0.1:6379>

  scard获取给定集合的成员个数

127.0.0.1:6379> sadd myset 0 1 2 3 4 5 6 7 8
(integer) 9
127.0.0.1:6379> scard myset
(integer) 9
127.0.0.1:6379>

  srandmember随机获取集合中的元素,但不移除元素

127.0.0.1:6379> SRANDMEMBER myset
"8"
127.0.0.1:6379> SRANDMEMBER myset
"6"
127.0.0.1:6379> SRANDMEMBER myset
"6"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "1"
2) "0"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "1"
2) "8"
127.0.0.1:6379>

  有序集合(Sorted sets)

  数据无序,不允许重复,每个元素都对应一个float型的分数,集合中元素按照顺序获取,排序规则如下

  1、如果A和B是两个具有不同分值的元素,如果A的分值大于B的分值,则A>B

  2、如果A和B有相同的分值,则如果A的字符串字典顺序比B的大,则A>B。A与B不可能具有相同的字符串,若字符串相同,则其分值将被覆盖。

127.0.0.1:6379> ZADD exam 134 math 120 Chinese 128 English 252 Synthesis
(integer) 4
127.0.0.1:6379> ZRANGE exam 0 -1
1) "Chinese"
2) "English"
3) "math"
4) "Synthesis"
127.0.0.1:6379>

  能够确认的是,输出的元素已经是有序的了,其中0和-1意思为从第一个数据到最后一个数据,输出分数可能更加直观

127.0.0.1:6379> ZRANGE exam 0 -1 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
5) "math"
6) "134"
7) "Synthesis"
8) "252"
127.0.0.1:6379>

  反向输出可以使用zrevrange

127.0.0.1:6379> zrevrange exam 0 -1 withscores
1) "Synthesis"
2) "252"
3) "math"
4) "134"
5) "English"
6) "128"
7) "Chinese"
8) "120"
127.0.0.1:6379>

  查找小于130分的课程

127.0.0.1:6379> ZRANGEBYSCORE exam -inf 130 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
127.0.0.1:6379>

  查找大于130分的课程

127.0.0.1:6379> ZRANGEBYSCORE exam 130 +inf withscores
1) "math"
2) "134"
3) "Synthesis"
4) "252"
127.0.0.1:6379>

  查找120到128的分数

127.0.0.1:6379> ZRANGEBYSCORE exam 120 128 withscores
1) "Chinese"
2) "120"
3) "English"
4) "128"
127.0.0.1:6379>

  可以发现,ZRANGEBYSCORE 查询出的元素包含第一个和最后一个,删除时也是如此

127.0.0.1:6379> ZREMRANGEBYSCORE exam 120 128
(integer) 2
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> ZRANGE exam 0 -1 withscores
1) "math"
2) "134"
3) "Synthesis"
4) "252"
127.0.0.1:6379>

  当分值相同,以字典顺序排序

127.0.0.1:6379> ZADD users 60 wangyangming 60 huxueyuan 60 lihongzhang 60 zengguopa
(integer) 4
127.0.0.1:6379> ZRANGE users 0 -1
1) "huxueyuan"
2) "lihongzhang"
3) "wangyangming"
4) "zengguopa"
127.0.0.1:6379>

  根据字段顺序查询元素,包括第一个元素,但不包括最后一个元素,如下例子为包含h开头的元素,但不包含w开头的元素。

127.0.0.1:6379> ZRANGEBYLEX users [h [w 
1) "huxueyuan"
2) "lihongzhang"
127.0.0.1:6379>

  

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
在微博微信场景下学习Redis数据结构

Redis安装 Redis核心数据结构以及使用场景 String结构 字符串常用操作 原子加减 String应用场景 这个是微信公众号的文章阅读量数量的统计,可以通过redis的string数据结构来解决。使用incr原...

osc_584bgu77
2019/10/20
2
0
Redis(一)基础数据结构

1.目录 Redis 基础数据结构 string (字符串) list (列表) hash (字典) set (集合) zset (集合) 容器型数据结构的通用规则 过期时间 2.Redis 基础数据结构 Redis 有 5 种基础数据结构,分别为...

osc_r8q2esik
2019/02/27
0
0
redis-数据结构以及使用场景分析

[toc] redis 常见数据结构以及使用场景分析 String Hash List Set Sort Set (ZSet) key 任何二进制序列都可以作为Redis的Key使用(例如普通的字符串或一张JPEG图片) 关于Key的一些注意事项:...

osc_tn8uhjgi
2019/06/04
8
0
redis应用场景

Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构...

lvzjane
2014/04/17
64
0
Redis常见问题与解答

常见Redis问题 Redis为什么这么快? 答: 数据结构简单,采用HashMap,HashMap的数据查找时间复杂度是O(1) 操作比较简单,常用的set,get 其内部的数据结构是经过专门设计的,自己底层做了一...

Real_man
2019/02/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hacker News 简讯 2020-07-11

更新时间: 2020-07-11 00:00 Scientists make precise edits to mitochondrial DNA for first time - (nature.com) 科学家首次对线粒体DNA进行精确编辑 得分:66 | 评论:4 LibreOffice: The N......

FalconChen
58分钟前
111
0
是否有可能从另一个git存储库中挑选一个提交? - Is it possible to cherry-pick a commit from another git repository?

问题: I'm working with a git repository that needs a commit from another git repository that knows nothing of the first. 我正在使用一个git存储库,需要从另一个不知道第一个存储库......

技术盛宴
昨天
26
0
【LeetCode】53 盛最多水的容器

题目 解题思路 双指针法: https://leetcode-cn.com/problems/container-with-most-water/solution/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/ 代码 public class Solution { ......

JaneRoad
昨天
20
0
阿里云OSS配置CDN加速

首先购买CDN流量包 然后添加域名 添加好后 然后将域名OSS.xxxx.com 解析到 生成的CDN域名上 这样就完成了

可达鸭眉头一皱
昨天
16
0
js 整数与小数正则替换片段

说明 /(\d+)/g 整数 /(\d+\.\d+)rem/g 小数 /(\d+\.\d+|\d+)rem/g 其中 | 或 条件 例子 全局查找带 rem 单位的,替换成 px 单位 let text = text.replace(/(\d+\.\d+|\d+)rem/g, function(s......

DrChenXX
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部