一、Redis 简介
Redis 是一个开源的用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并且可以提供多种语言的APi。Redi是一个key-value存储系统,它支持存储的value类型主要有以下几种类型:String-字符串类型,list-链表类型,set-集合类型,zset-sorted set有序集合和hash-哈希类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及其他操作,并且这些操作都是基于院子性的。在此基础上,redis支持各种不同方式的排序。并且为了保证效率,数据都是缓存在内存中,不过redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步。redis 数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其它从服务器的主服务器。这使得redis可执行单层树复制,存盘可以有意无意的对数据进行写操作。
二、数据结构
2.1 简单动态字符串(SDS)
2.2 双端链表
2.3 字典
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。
2.4 压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。
压缩列表是一种为节约内存而开发的顺序型数据结构,被用作列表键和哈希键的底层实现之一,并且可以包含多个节点,每个节点可以保存一个字节数组或者整数值。添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的几率并不高。
2.5 整数集合
三、Redis的对象系统
上面主要介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表和整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到至少一种我们前面所介绍的数据结构。通过这五种不同类型的对象,Redis可以在实现命令之前,根据对象的类型来判断一个对象是否可以指向给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。
除此之外,Redis的对象系统还实现了基于引用计数计数的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存会自动释放。另外,Redis还通过引用计数计数实现了对象共享机制,这一机制可以在适当的条件下,通过让多个数据库建共享同一个对象来节约内存。
Redis 使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,那么至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。Redis中的每一个对象都由一个redisObject 结构表示,该结构中和保存数据有关的三个属性分别为type - 类型 、encoding-编码 和 ptr-指向底层实现数据结构的指针。
type: 区分对象的类型,包括 REDIS_STRING-字符串对象、REDIS_LIST--列表对象、REDIS_HASH--哈希对象、REDIS_SET--集合对象和REDIS_ZSET--有序集合对象。对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是五种对象类型中的一种。
encoding:记录对象所使用的编码,也就是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以如下表所示:
编码常量
|
编码所对应的底层数据结构
|
REDIS_ENCODING_INT
|
long类型的整数
|
REDIS_ENCODING_EMBSTR
|
emstr 编码的简单动态字符串
|
REDIS_ENCODING_RAW
|
简单动态字符串
|
REDIS_ENCODING_HT
|
字典
|
REDIS_ENCODING_LINKEDLIST
|
双端链表
|
REDIS_ENCODING_ZIPLIST
|
压缩列表
|
REDIS_ENCODING_INTSET
|
整数集合
|
REDIS_ENCODING_SKIPLIST
|
跳跃表和字典
|
以下类型说明会以java代码作为辅助说明:
3.1 启动redis(redis 的安装步骤在这里不再阐述)
Jedis redis = new Jedis ("127.0.0.1",6379); //连接redis
1)连接操作命令
quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit
2)持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
3)远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器
4)对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit
2)持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
3)远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器
4)对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
3.3 String - 字符串类型
字符串对象的编码可以是REDIS_ENCODING_INT 、REDIS_ENCODING_EMBSTR 或者REDIS_ENCODING_RAW。
可以用long类型保存的整数,用INT型编码,可以用long double 类型保存的浮点数,用户EMBSTR 或者 RAW。字符串值,或者因为长度太大没办法用long类型表示的整数,又或者因为长度太长而没办法用long double 类型表示的浮点数,用EMBSTR 或者 RAW。
常用命令:
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串
3.4 List - 列表对象
列表对象的编码可以是ziplist 或者 linkedlist。ziplist 编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列表元素。linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。
常用命令:
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
字符串对象的编码可以是REDIS_ENCODING_INT 、REDIS_ENCODING_EMBSTR 或者REDIS_ENCODING_RAW。
可以用long类型保存的整数,用INT型编码,可以用long double 类型保存的浮点数,用户EMBSTR 或者 RAW。字符串值,或者因为长度太大没办法用long类型表示的整数,又或者因为长度太长而没办法用long double 类型表示的浮点数,用EMBSTR 或者 RAW。
常用命令:
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串
3.4 List - 列表对象
列表对象的编码可以是ziplist 或者 linkedlist。ziplist 编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列表元素。linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。
常用命令:
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
3.5 Hash- 哈希对象
哈希对象的编码可以是ziplist 或者 hashtable。ziplist 编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。
常用命令:
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
3.6 set-集合对象 和 有序集合
集合对象的编码可以是intset 或者 hashtable。intset 编码的集合对象使用证书集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
常用命令:
有序集合的编码可以是ziplist 或者 skiplist。
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
哈希对象的编码可以是ziplist 或者 hashtable。ziplist 编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。
常用命令:
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
3.6 set-集合对象 和 有序集合
集合对象的编码可以是intset 或者 hashtable。intset 编码的集合对象使用证书集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
常用命令:
有序集合的编码可以是ziplist 或者 skiplist。
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素