Redis理解
#####Redis
- 使用内存存储的非关系key-value型数据库
- 数据库存储选项:字符串(String),列表(List),集合(set),散列表(hash),有序集合(zset)
- 支持两种数据持久化方式:Snapshotting(快照),Append-Only file(追加)
- 支持主从复制
String
String的定义如下
struct sdshdr{
long len;
long free;
char buf[];
}
数据可以是字符串,整数或者浮点数,可以使用String类型缓存一些静态文件,如图片,css文件
String 支持 incr操作,可以用作统计计算,如统计访问次数,博客访问次数等
List
List的数据类型指key对应的value是一个双向链表结构,所以list支持所有的链表操作
List可以实现消息队列,减轻数据库的压力,每次有消息到达时就把消息队列放进尾部(rpush),取出时从队列头部取出(lpop)
Set
Set数据类型是一种无序集合,在redis内部使用hashtable实现,查找和删除的时间复杂度为o(1)
set数据优点是快速查找元素是否存在,用于记录一些不能重复的数据
包含字符串的无序收集器,并且被包含的每个字符串都是独一无二的,各不相同的
set类型通常用于记录做过某些事情
Sorted Set类型
SortedSet属于有序集合,通过一个double类型的整数score进行排序,SortedSort通过SkipList(跳跃表)和HashTable组合完成,SkipList负责排序,HashTable负责保存数据
set应用在排行榜的顶帖次数排序
Hash
Hash类型是每个key对应一个hashTable,添加删除和修改操作的时间复杂度都是o(1),hash类型适合用于存储对象
Redis使用zipmap存储数据,使用zipmap添加删除和修改的操作时间都是o(n),如果field和value大小超出一定限制,Redis在内部将zip-map替换为正常的hashmap存储
包含键值对的无序散列表
Redis排序命令详解
Redis支持对List,Set,Sorted Set类型进行排序
支持desc,asc,以及按照字母顺序排序(alpha选项)
可以使用limit选项来限定返回结果的数量
事务处理
一般情况下,Redis接收到一个客户端发来的命令,立刻执行返回结果,但是当发出multi命令,便连接进入一个事务的上下文,Redis把连接发来的命令存入一个队列中,当次连接发出exec命令,Redis便开始执行队列中的所有命令
可调用discard命令取消一个事务,discard的命令是清空事务队列并退出事务上下文
持久化
Redis是基于内存的数据库,内存数据库有个严重的弊端,突然宕机或停电内存的数据不会被保存,redis提供了两种方式:内存快照和日志追加
内存快照是将内存中的数据以快照的方式写入二进制文件中
Redis使用save,bgsave命令告诉redis需要做一次内存快照操作,save命令在主线程之间保存内存快照,redis由单线程处理所有请求,执行save命令可能阻塞其他客户端的请求。
日志追加(aof)方式是把增加修改数据的命令通过write函数追加到文件尾部,Redis重启时读取appendonlf.aof文件中的命令并且执行,从而把数据写入到内存中,日志追加方式有效降低数据丢失的风险
主从同步
主从同步可以防止主机坏掉导致网站不能正常运作,这种方法既把从机设置为主机即可,Redis支持主从同步,
- Master 可以有多个Slave
- 不会阻塞master当一个或者多个slave与master进行初次同步数据时,master可以继续处理客户端的请求
- 在master禁止数据持久化,只在slave进行数据持久化
杂项
内存淘汰:
- 随机淘汰算法:从数据库随机删除掉一个key
- LRU淘汰算法:从数据库中删除一个最近最少访问的key
- TTL淘汰算法:从数据库中删除一个最快过期的key
自动关闭超时连接:Redis有自动关闭超时连接的功能,当有一个客户端在一定时间内不进行任何操作时候redis自动关闭它
清除过期的数据:redis为每个数据都设定了一个过期的时间,当达到这个设定的过期时间,redis便会把这个数据删除掉
转载于:https://my.oschina.net/kakoi/blog/645149
上一篇: java后端如何调python接口
下一篇: 深入理解redis