一,redis数据结构
redis总共包含5种类型的数据结构,分别是String,Hash,List,Set,Sorted Set。下面我们来逐一介绍.
1.1 String
String就是基本的key-value数据结构。
常用命令:
get,set,mset,mget,decr,incr,getset,del,exists等。
1.2 Hash
Hash提供对象关系存储,相比String而言多了一层查找字段的功能。
举个例子,我们看hash的set命令:
HSET key field value
相比String而言,多了field名称,这样我们就可以以对象来存储对象的值。例如有一个对象Person,它有2个字段 name和sex。我们就可以使用
HSET person:1 name '张三';
HSET person:1 sex '男';
或者使用 HMSET person:1 name '张三' sex '男' ;
如果我们需要修改”张三”的姓名时,只需要
HSET person:1 name '李四'
即可。
常用命令:
hset,hget,hlen,hmset,hmget,hkeys,hdel,hincrby
1.3 List
List使用双向链表构成,它维护了一个给定key的一组数组值。你可以对这个list进行增删改查。
我们来看一个它的简单命令:
LPUSH key value [value …]
这里value可以是一个或者多个,这些value组成了一个list。
常用命令:
lpush,lpop,rpush,rpop,llen,lrange,lrem
1.4 Set
Set相比List就是存储的值不重复,即唯一的。Set操作还支持集合操作,交集,差集和并集。
命令格式如下:
SADD key member [member …]
常用命令:
sadd,srem,smembers,sismember,sdiff,sinter,sunion,scard等
1.4 Sorted Set
Sorted Set是有序的集合,使用跳表(skip list)实现的。
添加命令:
ZADD key [NX|XX] [CH] [INCR] score member [score member …]
zadd命令用于向有序集合中加入一个元素和改元素对应的分数,如果该元素存在则会用新的分数替换原来的分数。
常用命令:
zadd,zscore,zrange,zrangebyscore,zrem,zcard,zcount
二,存储结构
Redis内部使用一个redisObject对象来表示所有的key和value,我们先看redisObject:
type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:”123” “456”这样的字符串。
接下来,我们看redis的内存结构:
我们看到,dictEntry存储了key和val,它主要由链表实现。key是一个字符串,val可以是上面5种不同的数据类型。
更详尽的介绍请移步Redis内存存储结构分析
三,其他特性
这一小节主要介绍了redis的缓存失效,事务,发布订阅,持久化等方面。
3.1 缓存失效
在 Redis 提供的诸多命令中,EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT 以及 SETEX 和 PSETEX 均可以用来设置一条 Key-Value 对的失效时间,而一条 Key-Value 对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确)。
Redis 删除失效主键的方法主要有两种:
- 消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它
- 积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除—使用抽样方法,如果失效的主键数占抽样数的百分比大于25%,则继续抽样删除过程
3.2 事务
使用互斥
可以使用 multi(开始事务) ,discard(取消事务),exec(提交事务)。
注意:Redis 不支持回滚。
使用cas
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表示事务已经失败。
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
3.3 发布订阅
redis使用SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 来做发布订阅操作。你可以设定对某一个 key 值进行消息发布及消息订阅,当一个 key 值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。
3.4 持久化
redis的持久化有rdb和aof两种。
- rdb 记录一段时间内的操作,一般的配置是一段时间内操作超过多少次就持久化
- aof可以实现每次操作都持久化