`

Redis各种数据结构介绍以及相应的业务场景应用

 
阅读更多
1.redis现存的数据结构
二进制安全的 字符串 string
二进制安全的 字符串列表 list of string
二进制安全的 字符串集合 set of string,换言之:它是一组无重复未排序的element。可以把它看成Ruby中的 hash–其key等于element,value都等于’true‘。
有序集合sorted set of string,类似于集合set,但其中每个元素都和一个浮点数score(评分)关联。element根据score排序。可以把它看成Ruby中的 hash–其key等于element,value等于score,但元素总是按score的顺序排列,无需额外的排序操作。

2.Redis 键的使用原则
Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。
关于key的几条规则:
太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。
最好坚持一种模式。例如:”object-type:id:field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。

3.字符串类型
常用的操作命令有:set,get,incr,incrby以及getset等
set和get的例子:
$ redis-cli set mykey "my binary safe value"
OK
$ redis-cli get mykey
my binary safe value


字符是redis里最基本的类型,但是也可以实现一些有趣的操作
incr和incrby的例子:
$ redis-cli set counter 100
OK $ redis-cli incr counter
(integer) 101
$ redis-cli incr counter
(integer) 102
$ redis-cli incrby counter 10
(integer) 112
incr是原子操作,这也就意味着多个客户端对同一个key发出incr命令,也绝不会导致竞争的情况。


另一个比较有用途的命令是getset命令,意思是它为key设置新值返回旧值。


应用场景:你的系统每当有新用户访问时就用INCR命令操作一个Redis key。你希望每小时对这个信息收集一次。你就可以GETSET这个key并给其赋值0并读取原值。


4.列表类型
一般意义上讲,列表就是有序元素的序列:10,20,1,2,3就是一个列表。但用数组实现的List和用Linked List实现的List,在属性方面大不相同。


Redis lists基于Linked Lists实现。这意味着即使在一个list中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。用LPUSH 命令在十个元素的list头部添加新元素,和在千万元素list头部添加新元素的速度相同。
那么,坏消息是什么?在数组实现的list中利用索引访问元素的速度极快,而同样的操作在linked list实现的list上没有那么快。


Redis Lists用linked list实现的原因是:对于数据库系统来说,至关重要的特性是:能非常快的在很大的列表上添加元素。另一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。


常用操作命令:LPUSH LPOP RPUSH LRANGE LLEN等
LPUSH 命令可向list的左边(头部)添加一个新元素,而RPUSH命令可向list的右边(尾部)添加一个新元素。最后LRANGE 命令可从list中取出一定范围的元素
$ redis-cli rpush messages "Hello how are you?"
OK
$ redis-cli rpush messages "Fine thanks. I‘m having fun with Redis"
OK
$ redis-cli rpush messages "I should look into this NOSQL thing ASAP"
OK
$ redis-cli lrange messages 0 2
1. Hello how are you?
2. Fine thanks. I‘m having fun with Redis
3. I should look into this NOSQL thing ASAP
注意LRANGE 带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。


应用场景:list可被用来实现聊天系统。还可以作为不同进程间传递消息的队列。关键是,你可以每次都以原先添加的顺序访问数据。这不需要任何SQL ORDER BY 操作,将会非常快,也会很容易扩展到百万级别元素的规模。
例如在评级系统中,比如社会化新闻网站 reddit.com,你可以把每个新提交的链接添加到一个list,用LRANGE可简单的对结果分页。
在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入进博客评论,等等。


5.集合
Redis集合是未排序的集合,其元素是二进制安全的字符串。SADD命令可以向集合添加一个新元素。和sets相关的操作也有许多,比如检测某个元素是否存在,以及实现交集,并集,差集等等
$ redis-cli sadd myset 1
(integer) 1
$ redis-cli sadd myset 2
(integer) 1
$ redis-cli sadd myset 3
(integer) 1
$ redis-cli smembers myset
1. 3
2. 1
3. 2
检测元素是否存在的命令是sismember key
例如:
$ redis-cli sismember myset 3
(integer) 1
$ redis-cli sismember myset 30
(integer) 0


应用场景:
适合表现对象之间的关系。可以用集合类型实现标签功能。
下面是一个简单的方案:对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联。
例如假设我们的新闻ID 1000被加了三个标签tag 1,2,5和77,就可以设置下面两个集合:
$ redis-cli sadd news:1000:tags 1
(integer) 1
$ redis-cli sadd news:1000:tags 2
(integer) 1
$ redis-cli sadd news:1000:tags 5
(integer) 1
$ redis-cli sadd news:1000:tags 77
(integer) 1
$ redis-cli sadd tag:1:objects 1000
(integer) 1
$ redis-cli sadd tag:2:objects 1000
(integer) 1
$ redis-cli sadd tag:5:objects 1000
(integer) 1
$ redis-cli sadd tag:77:objects 1000
(integer) 1
要获取一个对象的所有标签,如此简单:
$ redis-cli smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2
例如我们也许想获得一份同时拥有标签1, 2, 10和27的对象列表。这可以用SINTER命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:
$ redis-cli sinter tag:1:objects tag:2:objects tag:10:objects tag:27:objects
... no result in our dataset composed of just one object ;) ...


6.有序集合
它和集合类型一个重要的区别是带有一个关联的score,以及一个类似LRANGE的操作可以返回有序元素,此操作只能作用于有序集合,它就是,ZRANGE 命令。
添加几个数据作为例子:
$ redis-cli zadd hackers 1940 "Alan Kay"
(integer) 1
$ redis-cli zadd hackers 1953 "Richard Stallman"
(integer) 1
$ redis-cli zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
$ redis-cli zadd hackers 1916 "Claude Shannon"
(integer) 1
$ redis-cli zadd hackers 1969 "Linus Torvalds"
(integer) 1
$ redis-cli zadd hackers 1912 "Alan Turing"
(integer) 1
对有序集合来说,按生日排序返回这些黑客易如反掌,因为他们已经是有序的。有序集合是通过一个dual-ported 数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N))。这还行,但当我们需要访问有序的元素时,Redis不必再做任何事情,它已经是有序的了:
$ redis-cli zrange hackers 0 -1
1. Alan Turing
2. Claude Shannon
3. Alan Kay
4. Richard Stallman
5. Yukihiro Matsumoto
6. Linus Torvalds
无论如何,我想反向对这些元素排序,这次就用 ZREVRANGE 代替 ZRANGE 吧:
$ redis-cli zrevrange hackers 0 -1
1. Linus Torvalds
2. Yukihiro Matsumoto
3. Richard Stallman
4. Alan Kay
5. Claude Shannon
6. Alan Turing


1)区间操作
有序集合之能不止于此,他能在区间上操作。例如获取所有1950年之前出生的人。我们用 ZRANGEBYSCORE 命令来做:
$ redis-cli zrangebyscore hackers -inf 1950
1. Alan Turing
2. Claude Shannon
3. Alan Kay
我们请求Redis返回score介于负无穷到1950年之间的元素(两个极值也包含了)。
也可以删除区间内的元素。例如从有序集合中删除生日介于1940到1960年之间的黑客。
$ redis-cli zremrangebyscore hackers 1940 1960
(integer) 2
ZREMRANGEBYSCORE 这个名字虽然不算好,但他却非常有用,还会返回已删除的元素数量。


更详细内容请参考
十五分钟介绍 Redis数据结构:http://blog.nosqlfan.com/html/3202.html?ref=rediszt

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    redis详细介绍

    这些丰富的数据结构使得Redis成为处理各种应用场景的强大工具。 #### 二、Redis内部组织结构 Redis的核心数据结构是基于哈希表实现的,每个键(key)都是一种简单的动态字符串(sds),而值(value)则是Redis对象(redis...

    Redis的介绍以及简单使用

    2. **性能优化**:根据业务场景选择合适的数据结构,减少不必要的网络通信,例如批量操作命令,避免频繁的小数据写入。 3. **安全措施**:配置好Redis的访问权限,避免直接暴露在公网,防止未授权访问。 4. **监控...

    Java操作Redis的多种数据类型

    在IT行业中,Redis是一个高性能的键值存储系统,常用于数据缓存、消息队列以及分布式锁等场景。...在实际项目中,还需要结合具体的业务需求和性能指标来选择合适的数据结构,以实现最优的解决方案。

    redisStudio管理软件

    它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这使得Redis在处理各种应用场景时具有高度灵活性。Redis的工作原理是将所有数据存储在内存中,通过高速读写实现高性能,同时提供了持久化功能,确保...

    redis-windows-7.0.7.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值存储系统,广泛应用于缓存、消息队列、数据持久化等多个场景。它的设计目标是速度极快,且支持多种数据结构,如字符串、哈希表、列表、集合、有序...

    windows 操作系统redis客户端

    它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这使得它在处理各种应用场景时非常灵活。 2. Windows上的Redis客户端选择: - Redis Desktop Manager:这是一个跨平台的图形化管理工具,提供了直观...

    redis-windows-6.2.6.4.zip

    Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合,这些数据结构的设计使得它非常适合处理各种数据存储和处理任务。例如,字符串是最基础的类型,可以存储简单的文本或数字;哈希表则适合存储对象...

    RedisDemo.rar

    在C#应用中使用Redis时,要注意合理设计键的命名空间,避免键冲突,并且根据业务需求选择合适的数据结构。同时,注意监控Redis服务器的资源使用情况,防止内存溢出。 总的来说,通过C#调用Redis,我们可以将基本不...

    redis6.2.5安装包Windows版

    Redis是一款高性能的键值对数据库,常用于缓存、消息队列等场景。在Windows操作系统上安装Redis 6.2.5,可以帮助开发者在本地...在实际应用中,还需要根据具体业务需求进行相应的配置和优化,以充分发挥Redis的优势。

    redis资料利于广大群众使用!!!

    它不仅支持简单的键值存储,还提供了丰富的数据结构,例如字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Sorted Set)等,适用于多种不同的业务场景。 - **字符串类型**(String):最基础的数据...

    spring-data-redis 1.7.6

    Redis是一个高性能的键值数据库,它以其丰富的数据结构、高效的性能以及广泛的应用场景深受开发者喜爱。Spring Data Redis使得在Java应用中集成和操作Redis变得简单而优雅。 在1.7.6版本中,Spring Data Redis提供...

    RedisDesktopManager Win 0.9.8.1156 redis的可视化管理工具

    Redis是一种高性能的键值存储系统,常用于缓存、消息代理以及数据结构服务器等多种场景。它支持多种数据类型,如字符串、哈希、列表、集合和有序集合,这使得Redis能够适应各种复杂的应用需求。RedisDesktopManager...

    在SQL中操作Redis或者Redis集群,达到Redis与MySQL的数据一致性.zip

    Redis是一个开源的、基于键值对的数据结构服务器,支持多种数据类型,如字符串、哈希、列表、集合和有序集合。它的工作方式是将所有数据存储在内存中,通过网络进行通信,因此读写速度极快。然而,内存中的数据不...

    PHP5.4redis 扩展文件

    Redis是一种开源的,基于键值对的NoSQL数据库,它以内存中的数据结构存储数据,同时支持持久化。这使得Redis在速度和响应时间方面表现出色,尤其适合于处理高并发场景和缓存服务。PHP5.4 Redis扩展允许开发者通过PHP...

    ### 这是一篇对Redis开发详细介绍的文

    Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,因其高性能、丰富的数据结构支持以及灵活的应用场景而备受青睐。本文旨在深入探讨Redis的核心特性、开发流程及实际应用场景,帮助读者全面理解...

    Redis高性能缓存.pdf

    Redis是一种开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis(Remote Dictionary Server)的主要特点是使用字典结构存储数据,并且支持多种数据类型,包括字符串(strings)、散列(hashes...

    SpringBoot项目+MybatisPlus使用+Redis缓存

    2. **数据结构丰富**:支持字符串、哈希、列表、集合、有序集合等多种数据结构,满足不同场景需求。 3. **持久化**:通过RDB或AOF方式,确保数据在服务器重启后不会丢失。 4. **主从复制**:通过复制机制,可以实现...

    mqtt+springBoot+redis消息处理,

    再来看Redis,它作为一个内存数据结构存储系统,支持多种数据结构如字符串、哈希、列表、集合、有序集合等。在MQTT消息处理中,Redis可以作为消息队列来缓存接收到的消息,确保即使在高并发情况下也能有效地处理和...

    Redis和memcache缓存基本实现

    在选择Redis或Memcached时,需要考虑业务场景的需求,例如是否需要复杂的数据结构、数据持久化、分布式支持等。对于简单缓存场景,Memcached可能更合适;而对于需要复杂操作或数据持久化的应用,Redis通常是更好的...

    redis中demo文档

    Redis支持多种数据结构如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)以及有序集合(sorted sets)等。 #### 安装与使用 - **安装**: Windows环境下,Redis无需复杂安装过程,只需下载并解压...

Global site tag (gtag.js) - Google Analytics