初识redis
redis 开源的,ANSI C语言,支持网络,多种语言API,可基于内存也可持久化的日志型,是一种键值数据库。2010 为vmare负责开发。
数据类型
除了常规的数值或字符串,redis还可以是以下形式之一;
lists(列表)
sets(集合)
sorted sets(有序集合)
Hashes(哈希值)
持久化
将 数据放在内存或者虚拟内存。持久化实现 一种是 截图方式把内存放入磁盘。二种是类似 mysql日志更新日志。 前者性能高,后者安全性好。
主从同步
从主同步到多台从服务器。
性能
相比硬盘来说, 内存记录起来无疑给redis带来非常优秀的性能,读写的性能有明显的差别
提供API的语言
c c++ c# lua python php perl objective-c javascript java haskell erlang common lisp clojure
安装环境
Redis3.0.0
安装redis
tar -zxvf redis-3.0.0-beta2.tar.gz
make
make test
启动redis
./redis-server (run the server with default conf) 默认模式启动
./redis-server /etc/redis/6379.conf 指定配置文件启动
src/redis-server
报错 |
解决方法 yum install gcc -y
报错 2
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
解决办法是:
make MALLOC=libc 暂时不知道什么意思
验证客户端连接验证
安装成功
设置开机启动
关闭redis
注意:redis-cli shutdown 并不起作用。
配置文件来启动
配置redis
@daemonize 默认情况下,redis不是后台运行,如果后台运行,需要YES参数
@pidfile 当redis 在后台运行的时候,redis默认会吧pid文件放在/var/run/redis.pid,可以配置到其他的地方。当运行多个redis服务时,需要指定不同的pid文件和端口。
@bind 指定Redis只接收来自该ip地址的请求,如果不进行设置,那么僵处理所有请求, 在生产环境中最好设置该项。
@port 默认是6379
@loglevel debug verbose notice warning 生产环境一般开启notice
@logfile 配置log文件的地址,默认使用标准输出。即打印在命令行终端的窗口上。
@databases 设置数据库的个数,可以使用select 《dbid>命令来切换数据库。默认使用的数据库时0
@save设置进行数据库镜像的频率
在60秒内有10000个keys发生变化,
在 300秒之内有10个KEYS发生变化
在900秒内有1个KEYS 发生变化时
@rdbcompression 在进行镜像备份时,是否压缩。
@dbfilename 镜像备份文件的文件名
@ dir 数据库镜像备份安置的路径,这里的路径跟文件名要分开配置是因为redis 在进行备份时,会把数据库状态写入一个临时的文件中,等备份完成时,在把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在指定的路径中。
@slaveof 设置数据库为其他的数据库的从数据库
@masterauth 当主数据库连接需要密码验证时,在这里指定。
@requirepass 设置客户端连接后进行任何其他指定前需要使用的密码。 警告:因为redis速度很快,所以一台比较好的服务器下,一个外部的用户可以在一秒中进行150次的密码尝试,这意味着尝试连接时讲收到error信息。
@maxclients 研制同事连接的客户数量。这个连接数超过这个值时,redis将不再接收其他连接请求。客户端尝试连接时讲收到error信息。
@maxmemory 设置redis使用的最大内存,当内存满的时候,如果还接收set命令,redis将先尝试剔除设置过的expire信息的key,不管该KEY的过期时间还有没有到达。在删除时,讲按照过期时间进行删除,最早讲要呗过期的KEY将最先被删除。如果带有expire信息的key都删光了,那么将返回错误,这样,redis讲不再接收写请求,只接收get请求,maxmemory的设置比较设和吧redis当做于类似memcache的缓存使用。
@appendonly 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,且备份不能很频繁,但如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失,所以redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。append only 模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动,会从该文件恢复出之前的状态,但是这样会造成appendonly.aof文件过大,所以redis还支持BGREWRITEAOF指令,对appendonly.aof进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof进行重写一次。
@appendfsync 设置对appendonly.aof文件进行同步的频率。always表示每次有写操作都进行同步,everysec 表示写操作进行累计,每秒同步一次。这个需要根据实际业务场景进行配置。
@vm-enabled 是否开启虚拟内存支持。因为redis是一个内存数据库,而且内存满的时候,无法接收新的写请求,所以在redis2.0中,提供了虚拟内存的支持。但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value 值放入交换区。这样保证了虽然使用虚拟内存,性能基本不受影响,同时,你需要注意的是把你要把vm-max-memory 设置到足够来放下你的所有的key.
@vm-swap-file 设置虚拟内存的交换文件路径
@vm-page-size 设置虚拟内存的页大小,如果你的value值比较大,比如你要在vule中放置博客,新闻之类的所有文章内容,就要放置的都是很小的内容,那么就设小一点。
@vm-pages设置交换文件的总和page数量,需要注意的是,page table 信息会放在物理内存中,每八个page就会占据RAM中的一个BYTE,总的虚拟内存大小=vm-gage-size * vm-pages
@glueoutputbuf 把小的输出缓存放在一起,已便能够在一个tcp PACKET 中客户端发送多个响应,具体原理和真实效果我不是很清楚。根据注释,你不是很清楚的时候选择YES
@hash-max-zipmap-entries
在redis2.0中引入了hash数据结构,当hash中包含超过指定袁术个数并且最大的元素,没有超过临界时,hash将以一种特殊的编码方式来存储,这里可以设置这里两个临界值。
@activerehashing
开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为NO。如果没有这么严格的实时性要求,可以设置为yes,已便能够尽可能快的释放内存
第三章 redis 常用命令
keys : 返回满足给定pattern 的所有KEY
exists 确认一个key是否存在
del 删除一个KEY
expire 设置一个key的过期时间
move 将当前数据库中的key 转移到其他数据库
persist 移除给定key的过期时间
randomkey 随机返回key空间一个key
rename 重命名Key
type 返回的类型
ping 测试连接是否激活
dbsize 返回当前数据库中的key的数目
info 获取服务器的信息和统计
monitor 实时转储收到的请求(实时写入)
config get 获取服务器配置信息
flushall 删除所有数据库中的所有key
第四章 redis 高级实用特性
requirepass beijing
主从复制
1 master 可以拥有多个slave
2 多个slave 可以连接同一个master外,还可以连接到其他slave
3 主从复制不会拥塞master,在同步数据时候,master可以继续处理client请求
4 提供系统的伸缩性
当配置好slave后,slave和master建立连接,然后发送sync命令。无论是第一次连接还是重新连接,master都会启动一个后台进程,讲数据快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master就发送文件给slave,slave讲文件保存到硬盘上,在加载到内存中,接着master就会把缓存的命令转发给slave,后续master将受到写命令发送给slave。如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送个所有slave。
如果配置主从
slaveof 192.168.1.1 6379 (指定master 的ip和端口)
事务控制
简单
持久化机制
redis是一个持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久性,redis支持两种持久化方式,一种是snapshotting也是默认的方式,另一种是append-only file 的方式。
@snapshotting 方式
快照是默认的持久化方式,这种方式就是讲内存中的数据以快照的方式写入到二进制文件中,默认的文件名字是 dump.rdb。可以通过配置设置自动做快照持久化的方式,我们可以配置redis在N秒内,如果超过m个key被修改就自动做快照,下面是默认的快照保存配置。
save 9001
save 300 10
sve 60 10000
@详细的保存快照的过程
1 redis调用fork,现在有了子进程和父进程。
2 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的实时复制机制父子进程会共享相同的物理页面,当父进程写请求时,os会为父进程要修改的页面创建副本,而不是共享的页面。所以子进程地址空间内的数据是fork时刻整个数据库的一个快照
3当子进程将进程快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
client也可以使用save或者bgsave命令通知redis做一次快照持久化。 save操作时在主线程中报错快照的,由于redis是一个主线程来处理所有client的请求,这种方式会阻塞所有clinet请求 。所以不推荐使用。另一个注意的是, 每次快照持久化都是讲内存数据完整写入到磁盘一次,不是增量的只同步变更数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘IO操作,可能会严重影响性能。
aof方式的持久化
另外,由于快照方式在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。下面介绍append-only file.
aof比快照方式由更好的持久化,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write 函数追加到文件中。当redis重启时,会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核汇总缓存write做的修改,所以可能不是立即写入磁盘上,这样的AOF方式的持久化也还是坑内丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过FSYNC函数强制os写入到磁盘的时机。有三种方式如下。
appendonly yes 启用aof持久化方式
appendfsync always 收到鞋命令就立即吸入用磁盘,最慢,但保证安全的持久化。
appendfsync everysec 每一秒写入磁盘一次,在性能和持久化方面做了最好的折中
appendfsync no 完全依赖os,性能最好,持久化没保证。
aof方式也同是带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test 命令100次,文件中有99条是没有意义的,其实保存一条set test 100就够了,为了压缩aof的持久化文件。redis提供了bgrewiteaof命令,收到此命令redis讲使用与快照类似的方式保存到临时的文件中,最后替换原来的文件。