欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis理解

程序员文章站 2022-03-05 10:02:14
...

#####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