redis学习

一,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可以实现每次操作都持久化

参考资料