更多博客请访问本人博客
1、redis基础数据结构
redis的所有数据结构都是由key-value构成的,key为关键字名称,value可以是字符串、哈希表、集合等
常用的key-value操作包括set、get、del、expire等操作。其中set使用比较常见,其用法如下:
set key value [ex seconds] [px milliseconds] [nx|xx]
ex表示过期时间,px表示时间单位(默认为秒),nx表示仅在key不存在时操作,xx表示在key存在时操作。实例set mykey "hello" ex 60表示设置一个(mykey,"hello")且过期时间为60秒的键值对。
1.1 字符串
字符串数据比较简单,上面的例子已经简单演示了。
1.2 Hash
Hash结构非常好用,通常的数据都是具有关联的,这也就是关系型数据库依然广泛使用的原因。那么要在redis中存储关系型数据就需要用到hash结构,例如现在要使用redis存储一个学校学生的信息,学生包括学号、姓名、性别。当然使用字符串也是可以解决的,我们可以构造一个如下所示的json字符串存储在redis中,key为学生学号:
{
num:111
name:zhang3
sex:male
}
但是这样做的缺点是当我们要对数据进行更改的时候就不方便了,需要把所有学生的数据获取之后解析json数据并进行更改,这样做很麻烦。我们使用redis能够很好地解决这个问题,上述的结构可以使用如下命令进行存储:
hmset 111 num 111 name zhang3 sex male
hmset可以同时为某个hash设置多个field-value对,更改也很方便,只要使用hset 111 name zhangsan
1.3 list
列表只是字符串列表,可以在列表的头部和尾部添加元素。由于redis的单个操作是原子性的,因此多个线程同时对redis进行读取并不会造成线程安全问题,由于redis的这个特征,它适合当做消息队列来使用。
1.4 set
redis的集合是唯一字符串的无序集合,通过使用sadd myset "value"进行插入操作,使用spop myset "value"进行弹出操作。
2、redis发布订阅
发布订阅模式是进程间通信的一种常用设计模式。redis的发布订阅模式具有如下几个特征:
- 由发布者、订阅者、信道组成
- 发送者在接受者接受消息的时候发送消息,过时的消息不会存储,后来的接受者不会接收到之前的消息。
- 接受者可以订阅多个信道
发布者通过使用publish channelName "message"来发送信息,订阅者通过subscribe channelName1 channelName2...来接收多个信道的消息。
3、redis原子性
所谓的原子性也可以称为不可分割性,或称“all or none”,redis的原子性包括两个方面:
- 单个操作是原子的
- 支持事务,multi命令与exec结合来实现多条命令的原子性。
4、拓展
redis是内存数据库,然而机器的内存是有限的,对于目前动辄上G上T的数据量,单个服务器的内存是不够用的,因此拓展的需求也是比较迫切的。对于redis,拓展性可以有两种方案来实现:
4.1 Twemproxy代理
集群要解决的一个重要问题是分区partition,多台服务器共同承载数据,那么就需要一个代理节点来进行全局的数据路由。Twemproxy是一个很好的选择,它使用了一致性hash算法将数据均分到多台redis上,而且一致性hash算法还能够保障集群拓展。
4.2 redis集群
从redis3.0开始,redis具有了自己的集群,使用hash槽算法来均分数据,redis集群的每个redis节点都可作为代理节点进行数据路由。
5、可靠性
redis的cluster-slave模式可以保障数据的可靠性,每一个hash槽都可以有1-N个备份节点,当主节点失效之后还能进行投票选出新的节点。cluster-slave模式的另外一个优点是,redis可以实现读写分离,主节点写入数据,slave节点用于数据读取。
6、持久化
redis用作数据储存还有一个优势是持久化,其他缓存例如memcached在端点之后就会丢失数据,而redis可以弥补这一不足。