Redis常见数据结构和使用场景

1、Redis 主要数据结构

1. String——字符串

String 数据结构是简单的 key-value 类型,value 不只能够是 String,也能够是数字(当数字类型用 Long 能够表示的时候encoding 就是整型,其余都存储在 sdshdr 当作字符串)。使用 Strings 类型,能够彻底实现目前 Memcached 的功能,而且效率更高。还能够享受 Redis 的定时持久化(能够选择 RDB 模式或者 AOF 模式),操做日志及 Replication 等功能。除了提供与 Memcached 同样的 get、set、incr、decr 等操做外,Redis 还提供了下面一些操做:html

1.LEN niushuai:O(1)获取字符串长度
2.APPEND niushuai redis:往字符串 append 内容,并且采用智能分配内存(每次2倍)
3.设置和获取字符串的某一段内容
4.设置及获取字符串的某一位(bit)
5.批量设置一系列字符串的内容
6.原子计数器
7.GET SET 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用
mysql

 

2. Hash——字典

在 Memcached 中,咱们常常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(通常是 JSON 格式),好比用户的昵称、年龄、性别、积分等。这时候在须要修改其中某一项时,一般须要将字符串(JSON)取出来,而后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗一定是很大的,也不适用于一些可能并发操做的场合(好比两个并发的操做都须要修改积分)。而 Redis 的 Hash 结构可使你像在数据库中 Update 一个属性同样只修改某一项属性值。
存储、读取、修改用户属性redis

hash操做指令算法

[sql

hset key field value 设置hash field为指定值,若是key不存在,则先建立mongodb

hget key field 获取指定的hash field数据库

hmget key filed1....fieldN 获取所有指定的hash filedbash

hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field服务器

hincrby key field integer 将指定的hash filed 加上给定值数据结构

hexists key field 测试指定field是否存在

hdel key field 删除指定的hash field

hlen key 返回指定hash的field数量

hkeys key 返回hash的全部field

hvals key 返回hash的全部value

hgetall key 返回hash的全部filed和value

]

3. List——列表

List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。使用 List 结构,咱们能够轻松地实现最新消息排行等功能(好比新浪微博的 TimeLine )。List 的另外一个应用就是消息队列,能够利用 List 的 *PUSH 操做,将任务存在 List 中,而后工做线程再用 POP 操做将任务取出进行执行。Redis 还提供了操做 List 中某一段元素的 API,你能够直接查询,删除 List 中某一段的元素。
1.微博 TimeLine
2.消息队列

 

4. Set——集合

Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,能够存储一些集合性的数据。好比在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。由于 Redis 很是人性化的为集合提供了求交集并集差集等操做,那么就能够很是方便的实现如共同关注、共同喜爱、二度好友等功能,对上面的全部集合操做,你还可使用不一样的命令选择将结果返回给客户端仍是存集到一个新的集合中。

求交集:sinter key  [key...]

求并集:sunion key [key...]

求差集:sdiff key [key ...] 得出key中其余key不存在数据。

1.共同好友、二度好友(求交集)
2.利用惟一性,能够统计访问网站的全部独立 IP(去重)
3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就能够推荐(求交集)

 

5. Sorted Set——有序集合

和Sets相比,Sorted Sets是将 Set 中的元素增长了一个权重参数 score,使得集合中的元素可以按 score 进行有序排列,好比一个存储全班同窗成绩的 Sorted Sets,其集合 value 能够是同窗的学号,而 score 就能够是其考试得分,这样在数据插入集合的时候,就已经进行了自然的排序。另外还能够用 Sorted Sets 来作带权重的队列,好比普通消息的 score 为1,重要消息的 score 为2,而后工做线程能够选择按 score 的倒序来获取工做任务。让重要的任务优先执行。

1.带有权重的元素,好比一个游戏的用户得分排行榜
2.比较复杂的数据结构,通常用到的场景不算太多

    zscore key member     获取member的分值

    zrank key  member 获取member的排名

    zrange key start end    获取score范围在start到end之间的member 

 

6. HyperLogLog——作基数统计

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。

     HyperLogLog这个数据结构用于基数统计。

     Redis HyperLogLog 是用来作基数统计的算法,HyperLogLog 的优势是,在输入元素的数量或者体积很是很是大时,计算基数所需的空间老是固定 的、而且是很小的

     在 Redis 里面,每一个 HyperLogLog 键只须要花费 12 KB 内存,就能够计算接近 2^64 个不一样元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合造成鲜明对比。

    可是,由于 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素自己,因此 HyperLogLog 不能像集合那样,返回输入的各个元素。

     主要功能:用于统计不一样值元素的个数,好比统计一天中有多少个用户(IP)访问服务器,只须要统计有多少个不一样的IP 的个数就能够

 什么是基数

   好比数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素个数)为5。 基数估计就是在偏差可接受的范围内,快速计算基数。

   下表列出了 redis HyperLogLog 的基本命令:

序号 命令及描述
1 PFADD key element [element ...] 
添加指定元素到 HyperLogLog 中。
2 PFCOUNT key [key ...] 
返回给定 HyperLogLog 的基数估算值。
3 PFMERGE destkey sourcekey [sourcekey ...] 
将多个 HyperLogLog 合并为一个 HyperLogLog
redis 127.0.0.1:6379> PFADD mykey "redis"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mongodb"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mysql"  
1) (integer) 1  
redis 127.0.0.1:6379> PFCOUNT mykey  
(integer) 3

 

7.其余数据结构

    bitmaps  位图

    地理空间(geospatial) 索引半径查询

    详细文档能够查看http://www.redis.cn/

 

2、redis 其余功能使用场景

1. 订阅-发布系统

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在 Redis 中,你能够设定对某一个 key 值进行消息发布及消息订阅,当一个 key 值上进行了消息发布后,全部订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用做实时消息系统,好比普通的即时聊天,群聊等功能。

2. 事务——Transactions

谁说 NoSQL 都不支持事务,虽然 Redis 的 Transactions 提供的并非严格的 ACID 的事务(好比一串用 EXEC 提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),可是这个 Transactions 仍是提供了基本的命令打包执行的功能(在服务器不出问题的状况下,能够保证一连串的命令是顺序在一块儿执行的,中间有会有其它客户端命令插进来执行)。Redis 还提供了一个 Watch 功能,你能够对一个 key 进行 Watch,而后再执行 Transactions,在这过程当中,若是这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。