Redis详解

1.redis简介
redis是一种开源的使用c语言编写的, 遵守BSD协议,支持网络,可基于内存亦可持久化的日志型,高性能key-value数据库,并提供多种语言的api。读取速度可高达110000次/s,写速度高达81000次/s。目前支持多种数据类型string(字符串),list(链表),set(集合)zset(sorted set-有序集合),hash(哈希类型)。这些数据类型都支持push/pop,add/remove及取交集和并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中的。redis会周期性的把更新的数据写入磁盘或者修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis还支持 publish/subscribe, 通知, key 过期等等特性。redis是单线程+io多路复用,默认端口6379,默认16个数据库,下标从0开始。memchached是多线程加锁。

2.什么是原子性,什么是原子性操作
举个例子:
A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:
  •  1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
  •  2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。
如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。
我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。
如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。

3.redis安装
window下安装
命令窗口 redis-server.exe redis.windows.conf 
测试重新打开一个命令窗口
redis-cli.exe -h 127.0.0.1 -p 6379 
set myKey abc
get myKey

linux下安装
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz$ tar xzf redis-2.8.17.tar.gz$ cd redis-2.8.17$ make
//默认启动
$ cd src$ ./redis-server
//指定配置文件启动
$ cd src$ ./redis-server redis.conf

ubuntu下安装
$sudo apt-get update$sudo apt-get install redis-server
//启动redis
$ redis-server
//查看redis是否启动
$ redis-cli
//以上命令将打开以下终端
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> pingPONG
以上说明我们已经成功安装了redis。

mac下安装
官网 http://redis.io/ 下载最新的稳定版本,这里是3.2.0
sudo mv 到 /usr/local/
sudo tar -zxf redis-3.2.0.tar 解压文件
进入解压后的目录 cd redis-3.2.0
sudo make test 测试编译
sudo make install 

4.redis的相关场景
  • 缓存(存储一些高访问量的数据)
  • Pub/Sub
在更新中保持用户对数据的映射是系统中的一个普遍任务。Redis的pub/sub功能使用了SUBSCRIBE、UNSUBSCRIBE和PUBLISH命令,让这个变得更加容易。
  • 队列
在当前的编程中队列随处可见。除了push和pop类型的命令之外,Redis还有阻塞队列的命令,能够让一个程序在执行时被另一个程序添加到队列。你也可以做些更有趣的事情,比如一个旋转更新的RSS feed队列。
  • 实时分析正在发生的情况,用于数据统计与防止垃圾邮件等
使用Redis原语命令,更容易实施垃圾邮件过滤系统或其他实时跟踪系统。
  • 特定时间内的特定项目
这是特定访问者的问题,可以通过给每次页面浏览使用SADD命令来解决。SADD不会将已经存在的成员添加到一个集合。
  • 计数
进行各种数据统计的用途是非常广泛的,比如想知道什么时候封锁一个IP地址。INCRBY命令让这些变得很容易,通过原子递增保持计数;GETSET用来重置计数器;过期属性用来确认一个关键字什么时候应该删除。
  • 过期项目处理
使用unix时间作为关键字,用来保持列表能够按时间排序。对current_time和time_to_live进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用ZRANGE...WITHSCORES进行查询,删除过期的条目。
  • 按照用户投票和时间排序
这就像Reddit的排行榜,得分会随着时间变化。LPUSH和LTRIM命令结合运用,把文章添加到一个列表中。一项后台任务用来获取列表,并重新计算列表的排序,ZADD命令用来按照新的顺序填充生成列表。列表可以实现非常快速的检索,即使是负载很重的站点。
  • 排行榜及相关问题
排行榜(leader board)按照得分进行排序。ZADD命令可以直接实现这个功能,而ZREVRANGE命令可以用来按照得分来获取前100名的用户,ZRANK可以用来获取用户排名,非常直接而且操作容易。
  • 删除和过滤
如果一篇文章被删除,可以使用LREM从缓存中彻底清除掉。
  • 在主页中显示最新的项目列表
Redis使用的是常驻内存的缓存,速度非常快。LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容量,这时才需要把请求发送到数据库。

5. redis.conf
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
     daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
     pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
     port 6379
4. 绑定的主机地址
     bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
     timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
     loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
     logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
     databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
     save <seconds> <changes>
    Redis默认配置文件中提供了三个条件:
     save 900 1
     save 300 10
     save 60 10000
    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
     rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
     dbfilename dump.rdb
12. 指定本地数据库存放目录
     dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
     slaveof <masterip> <masterport>
14. 当master服务设置了密码保护时,slav服务连接master的密码
     masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
     requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
     maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
     maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
     appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
      appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值: 
     no :表示等操作系统进行数据缓存同步到磁盘(快) 
     always :表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
     everysec :表示每秒同步一次(折衷,默认值)
     appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
      vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
      vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
      vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
      vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
      vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
      vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
     glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
     hash-max-zipmap-entries 64
     hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
     activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
     include /path/to/local.conf

6.什么是守护进程
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。

7.redis持久化
rdb(redis database):在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中
aof(append of file): 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

8.redis命令
key操作
keys *
查看当前库所有的键
exists <key>
判断是否存在key
del <key>
删除某个键
expire <key> <second>
设置键过期时间 单位是s秒
ttl <key>
查看还有多少秒过期 -1表示用不过期 -2表示已经过期
move <key> <db>
把键移到另一个库下
dbsize
查看数据库key的数量
flushdb
清空当前库
flushall
通杀所有库
String类型:String是二进制安全的,可以包含任何数据源,最大512m
get <key>
查看对应的键值
set <key> <value>
添加键值对
append <key> <value>
将给定的value 追加到原值的末尾
strlen < key >
获取值得长度
setnx <key> <value>
当key 不存在的时候设置key值
incr <key>
将key中储存的数字加1,如果为空,则值为1
decr <key>
将key中储存的数字减1,如果为空,则值为-1
incrby/decrby <key> <步长>
将key中的数字增减
String批量处理:
mset <key1> <value1> <key2> <value2>
同时设置多个键值对
mget <key1> <key 2>
同时获得多个值
msetnx <key1> <value1> <key2> <value2>
当给定的key都不存在
getrange <key> <start> <stop>
类似sunstring
setrange <key> <start> <stop>
类似sunstring覆盖原始值
setex <key> <过期时间> <value>
设置键值的同时,给定过期时间
getset <key> <value>
以旧换新,设置了新的值同时得到旧值
List:链表
特点:单键多值
Redis列表是简单的字符串列表,从左或者从右插入
底层是双向链表,对两端的操作性能很高,通过下标查询性能很低
lpush/rpush <key> <value1> <value2> ..
从左或从右插入多个值
lpop/rpop <key>
从左边或右边吐出一个值,值光键亡
rpoplpush <key1> <key2>
从key1 右边吐出一个值到key2的左边
lrange <key> <index>
按照索引下标获取元素 从左到右
lindex <key> <index>
按照索引下标获取元素 从左到右
llen <key> 获取列表长度
获取列表长度
linsert <key> before <value> <newvalue>
在key中value前插入newvalue
Set:类似list的无序集合,保证列表中不会有重复数据,底层是一个value为null的hash表
sadd <key> <value1> <value2>
将多个元素加入到key中,重复值忽略
smembers <key>
取出该集合的所有值
sismember <key> <value>
判断集合key中是否有该value值 有就1 没有0
scard <key>
返回该集合的元素个数
srem <key> <value1> <value2>
删除集合中的某个元素
spop <key>
随机吐出该集合一个值
srandmember <key> <n>
随机从集合中取出n个值,不会从集合中删除
smove <key1> <key2> <value>
将key1中的value 移动到key2 中
sinter <key1> <key2>
返回两个集合的交集元素
sunion <key1> <key2>
返回两个集合的并集
hash:键值对集合,类似map<String,Object>
hset <key> <filed> <value>
给key 集合中的file 键赋值value
hget <key1> <field>
从key1 集合file取出value
hmset <key1> <field1> <value1> <field2> <value2>
批量设置hash的值
hexists <key> <field>
查看key中的field 是否存在
hkeys <key>
列出key中所有的filed
hvals <key>
列出该hash集合中所有的value
zset:与set集合非常相似,每个成员都关联了score,可以用来排序
zadd<key><score1><value1><score2><value2>
将一个或多个元素以及score加入zset
zrange<key><start><stop> withscore
返回下标在区间内的集合,带有score
zrangebyscore <ket> <min> <max>[withscore] [limit offset count]
返回key中 score介于min和max中的成员,升序排列
zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count]
降序
zincrby <key> <increment> <value>
在key集合中的value上增加increment
zrem <key> <value>
删除key集合下的指定元素
zcount <key> <min><max>
统计 区间内的元素个数
zcord <key>
获取集合中的元素个数
zrank <key><value>
查询value在key中的排名,从0开始

9.redis的数据备份与回复
Redis  SAVE  命令用于创建当前数据库的备份。
语法
redis Save 命令基本语法如下:
redis 127.0 . 0.1 : 6379 > SAVE
实例
redis 127.0 . 0.1 : 6379 > SAVE OK
该命令将在 redis 安装目录中创建dump.rdb文件。

恢复数据
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用  CONFIG  命令,如下所示: redis 127.0 . 0.1 : 6379 > CONFIG GET dir 1 ) "dir" 2 ) "/usr/local/redis/bin"
以上命令  CONFIG GET dir  输出的 redis 安装目录为 /usr/local/redis/bin。

Bgsave
创建 redis 备份文件也可以使用命令  BGSAVE ,该命令在后台执行。
实例
127.0 . 0.1 : 6379 > BGSAVE Background saving started

10.redis安全
我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
实例
我们可以通过以下命令查看是否设置了密码验证:
127.0.0.1:6379> CONFIG get requirepass1) "requirepass"2) ""
默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。
你可以通过以下命令来修改该参数:
127.0.0.1:6379> CONFIG set requirepass "runoob"OK127.0.0.1:6379> CONFIG get requirepass1) "requirepass"2) "runoob"
设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。
语法
AUTH  命令基本语法格式如下:
127.0.0.1:6379> AUTH password
实例
127.0.0.1:6379> AUTH "runoob"OK127.0.0.1:6379> SET mykey "Test value"OK127.0.0.1:6379> GET mykey"Test value"
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页