注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Redis学习笔记  

来自彭+1   2014-03-25 09:46:12|  分类: 数据库相关 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Redis是一个Key-Value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1. 基本类型
string:
是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。
list:
是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
set:
redis的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素。set的是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。
sorted set:
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set的实现是skip list和hash table的混合体当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list并按照score排序,所以就可以有序的获取集合中的元素
hash:
redis hash是一个string类型的field和value的映射表.它的添加,删除操作都是O(1)(平均).hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用zipmap(又称为small hash)来存储的。这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽管zipmap的添加,删除,查找都是O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)
各种类型有对应的get和set操作,像set这些数据类型还会有并集和交集的一些操作,这里就不详细叙述了,网上有很多的资料。

2. 服务器相关操作
这里要插入说一个概念,redis里其实也有db的概念,一个redis服务器,通常可以将自己分成若干个db,每个db里有各自的key-value数据,像我们用使用mysql时候用use dbname去切换到自己所要的数据库一样,在redis里可以通过select 命令去切换,稍微有区别的是redis里是用数字来标记dbname的,比如 select 0, select 1, 具体的db的数量是通过config文件里的databases这个来确定的
key: 可以用来查询redis里存在的key,支持匹配查询,例如 key *就是查询当前存在的所有key, key abc*就是所有以abc起头的key
exists:确认是否存在这个key
del: 删除key
type:之前也说过,每种数据类型支持不同的操作,用户在通过type命令得到key所对应的value的type后,就可以使用对应的命令去操作这个key
dbsize:可以得到当前的redis-db所包含的key的数量
flushdb:清理当前redis db里所有的key
flushall:清理redis服务器里所有db的key
这些命令都是常用的,其他的一些命令大家可以自己再看教程

3.主从复制
Redis学习笔记 - 网易杭州QA - 网易杭州 QA Team

redis通过设置配置文件里的slaveof, 设置该数据库为其他数据库的从数据库 

从上面的流程可以看出,Slave从库在连接Master主库时,Master会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题,比如一台线上正在运行的Master主库配置了一台从库进行简单读写分离,这时Slave由于网络或者其它原因与Master断开了连接,那么当Slave进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然重新建立整个内存表,一方面Slave恢复的时间会非常慢,另一方面也会给主库带来压力。不过在同步完内存快照后,接下去就是同步主库的写命令。 

 

持久化

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof )的方式

Snapshoting:

先来看看几个快照持久化需要的配置,再来看快照持久化的逻辑

dir:数据库镜像备份的文件放置的路径

dbfilename:镜像备份文件的文件名

rdbcompression:在进行镜像备份时,是否进行压缩 l

save:save 设置Redis进行数据库镜像的频率

开启快照持久化后,数据库就会根据save的配置去将内存快照持久化到指定的文件去。持久化时候是redis后台开一个线程,将内存快照先写到一个临时文件,写完后再用临时文件去替换指定的文件,也就是配置文件定义的dbfilename。

快照持久化有一个不足,就是一旦数据库出现问题,那么我们的RDB文件中保存的数据并不是全新的

AOF:

照旧我们先来看看几个配置

appendonly:启用aof持久化方式

appendfsync:写aof日志的频率,支持always/everysec/no,分别代表着事实写,每秒钟写一次以及依赖os来确认写入的频率,一般linux是30s

使用AOF后,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件。


简单事物:

redis支持简单的事物,这个我们记住3个命令即可。分别是multi,exec和discard。

使用也很简单,输入multi后,接下去的redis命令都不会马上执行,一直等到exec的信号后才会作为一个事物一起执行,但是,如果收到不是exec而是discard的话就是取消命令了


虚拟内存

首先说明下redis的虚拟内存与操作系统的虚拟内存不是一码事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外的能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换的磁盘上。如果我们的存储的数据总是有少部分数据被经常访问,大部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃。当少量数据被经常访问时,使用虚拟内存不但能提高单台redis server数据库的容量,而且也不会对性能造成太多影响

使用虚拟内存的话有几个配置:

vm-enabled yes                                    #开启vm功能 

vmswap-file /tmp/redis.swap            #交换出来的value保存的文件路径 

vm-max-memory 1000000                 #redis使用的最大内存上限

 vm-page-size 32                                  #每个页面的大小32个字节 

vm-pages 134217728                         #最多使用多少页面 

vm-max-threads 4                               #用于执行value对象换入换出的工作线程数量

原理这里就不细说了,对测试人员来说,只是需要有这个概念,但是对我们实际工作影响不大


其他的redis还支持许多工作,就不一一举例了,大家可以知道一下概念,

例如:

安全性:通过配置文件设置密码后,以后对redis的操作就需要先验证这个密码

Pipeline:使用java,python等api接口去操作redis的时候,每条命令发一个包有可能会造成服务器负载过大,一个解决方法就是把多条命令打成一个包发过去,pipeline就是这个用途


 
  评论这张
 
阅读(494)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016