redis数据类型

Redis数据类型

Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String、List、Hash、Set和Sorted Set、bitMap,hyperLoglog。Redis数据类型内存结构分析

List应用场景:

String是最常用的一种数据类型,普通的key/value存储都可以归为此类。

常用命令:

(1)set 设置key对应的值为String类型的value

(2)get  获取key对应的值

(3)expire  设置过期时间

(4)type  查看值数据类型

(5)select 库号   选择查看指定的库数据

命令说明:

setnx设置key对应的值为String类型的value,如果key已经存在则返回0

setex设置key对应的值为String类型的value,并设定有效期

setrange设置key对应value的子字符串

getrange获取key对应value的子字符串

mset批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置

msetnx同mset,不存在就设置,不会覆盖已有的key

getset设置key的值,并返回key旧的值

append给指定key的value追加字符串,并返回新字符串的长度

strlen取指定key的value的长度

Hash类型

Hash是一个String类型的field和value之间的映射表,即redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。


                                                                          Hash 数据类型内部结构示意图

当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

应用场景

用一个对象来存储用户信息,商品信息,订单信息等等。

List类型

Redis的List类型其实就是每一个元素都是String类型的双向链表。我们可以从链表的头部和尾部添加或者删除元素。这样的List既可以作为栈,也可以作为队列使用。

List数据结构内部示意图

应用场景

如好友列表,粉丝列表,消息队列,最新消息排行等。

常用命令

(1)lpush——在key对应的list的头部添加一个元素。

(2)lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素。

(3)lpop——从key对应的list的尾部删除一个元素,并返回该元素。

Set类型

Redis 集合(Set类型)是一个无序的String类型数据的集合,类似List的一个列表,与List不同的是Set不能有重复的数据。实际上,Set的内部是用HashMap实现的,Set只用了HashMap的key列来存储对象。我们来看看java中HashSet的源码:

可见创建一个HashSet的时候实际上创建了一个HashMap;Set中的元素,只是存放在了底层HashMap的key上,底层HashMap的value列为空,遍历HashSet的时候从HashMap中取出keySet来遍历。


Set底层结构示意图

应用场景

集合有取交集、并集、差集等操作,因此可以求共同好友、共同兴趣、分类标签等。

常用命令

(1)sadd——在key对应的set中添加一个元素。

(2)smembers——获取key对应的set的所有元素。

(3)spop——随机返回并删除key对应的set中的一个元素。

SortSet

SortSet顾名思义,是一个排好序的Set,它在Set的基础上增加了一个顺序属性score,这个属性在添加修改元素时可以指定,每次指定后,SortSet会自动重新按新的值排序。sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score。

应用场景

如按时间排序的时间轴。

常用命令

(1)zadd ——在key对应的zset中添加一个元素

(2)zrange——获取key对应的zset中指定范围的元素,-1表示获取所有元素

Redis常用命令

键值常用命令

keys/exits/del/expire/ttl/move/persist/randomkey/rename/type

服务器常用命令

ping/echo/select/quit/dbsize/info/config get/flushdb/flushall


Redis分布式存储的2种常见的方案:

1. 主从

2.cluster

Redis集群切片常见的方式:

1. 客户端切片,即在客户端就通过key的hash值对应到不同的服务器。

2. 对数据根据key散列到不同的slot上,不同的slot对应到不同服务器上。



Redis自增实现计数

计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个INCR命令。

比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。

比如用户名是peter,点击时间是 2012 年 3 月 22 日,那么执行命令INCRpeter::2012.3.22。

可以用以下几种方式扩展这个简单的模式:

可以通过组合使用INCR和EXPIRE,来达到只在规定的生存时间内进行计数(counting)的目的。

客户端可以通过使用GETSET命令原子性地获取计数器的当前值并将计数器清零,更多信息请参考GETSET命令。

使用其他自增/自减操作,比如DECR和INCRBY,用户可以通过执行不同的操作增加或减少计数器的值,比如在游戏中的记分器就可能用到这些命令。

你可能感兴趣的:(redis数据类型)