转载

【Redis】Redis 初探

一 简介
  Redis 是一款完全开源免费的高性能的key-value数据库,可以作为缓存,kv结构存储和队列,目前在互联网行业比较广泛使用。
  Redis作为Key-value型数据库,它提供了Key-Value 映射关系。除了常规的数值或字符串,Redis的键值能够提供 Lists,Sets,Sorted sets (有序集合),Hashes (哈希表) 多种结构。其中有序集合值得大家去关注。Redis支持诸如列表、集合或有序集合的交集、并集、差集等高级原子操作;同时,如果键值的类型是普通数字,Redis则提供自增等原子操作。
  Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:使用快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反,性能较低,但是能保证数据尽量不丢失。

二 安装
安装依赖包
yum install gcc-c++
yum install -y tcl
获取redis软件
  1. wget http://download.redis.io/releases/redis-2.8.13.tar.gz
  2. tar -xzvf redis-2.8.13.tar.gz
  3. mv redis-2.8.13 /usr/local/redis
  4. cd /usr/local/redis
  5. make
修改配置文件
mkdir -p /etc/redis
cp redis.conf /etc/redis
注意修改
daemonize yes (no-->yes)设置后台启动。
启动redis
root@rac4:~# >/usr/local/bin/redis-server /etc/redis/redis.conf
如果启动失败会有如下报错:
  1. root@rac4:~# >redis-cli
  2. Could not connect to Redis at 127.0.0.1:6379: Connection refused
  3. not connected> exit
解决问题之后 重新启动
  1. root@rac4:~# >/usr/local/bin/redis-server /etc/redis/redis.conf
  2. root@rac4:~# >redis-cli
  3. 127.0.0.1:6379>
  4. 127.0.0.1:6379>
  5. 127.0.0.1:6379>
  6. 127.0.0.1:6379> set company youzan.com
  7. OK
  8. 127.0.0.1:6379> get company
  9. "youzan.com"
  10. 127.0.0.1:6379>
三 Redis配置文件介绍
  1. ####基本配置####
  2. daemonize yes #默认值no,该参数用于定制redis服务是否以守护模式运行。---
  3. pidfile /srv/redis/run/redis.pid #默认值/var/run/redis.pid,指定redis服务的进程号文件路径,以守护模式运行时需要配置本参数;
  4. port 6379 #默认值6379,指定redis服务的端口
  5. bind 127.0.0.1 #绑定ip,默认是本机所有网络设备
  6. timeout 0 #客户端空闲n秒后断开连接;默认是 0 表示不断开。
  7. loglevel notice ###设置服务端的日志级别,2.8版本默认是notice。有下列几种选择:
  8.     debug:记录详细信息,用于开发或调试;
  9.     verbose:提供很多有用的信息,但是又不像debug那么详尽,默认就是这一选项;
  10.     notice:适度提醒,多用于产品环境;
  11.     warning:仅显示重要的警告信息;
  12. logfile stdout #指定日志的输出路径,默认值stdout,表示输出到屏幕,守护模式时则输出到/dev/null;
  13. syslog-enabled no #如果要输出日志到syslog中,可以启动syslog-enabled yes,默认该选项值为no。
  14. databases 16 #指定数据库的数量,默认为16个,默认使用的数据库是DB 0。
  15. ####持久化相关配置###
  16. #save <seconds> <changes> ##指定多长时间刷新快照至磁盘,这个选项有两个属性值,只有当两个属性值均满足时才会触发;可以设置多种级别,例如默认的参数文件中就设置了:
  17. save 900 1 #每900秒(15分钟)至少一次键值变更时被触发;
  18. save 300 10 #每300秒(5分钟)至少10次键值变更时被触发;
  19. save 60 10000 #每60秒至少10000次键值变更时被触发;
  20. rdbcompression yes ##默认值yes,当dump数据库时使用LZF压缩字符串对象,如果CPU资源比较紧张,可以设置为no,选择不压缩;
  21. rdbchecksum yes
  22. # The filename where to dump the DB 数据库文件名
  23. dbfilename dump.rdb ##默认值dump.rdb,dump到文件系统中的文件名,注意只能是名称,不能是路径。
  24. dir /usr/local/webserver/redis/db ##默认值./,即当前目录,dump出的数据文件的存储路径;

  25. ####以下为复制相关的设置#####
  26. ####复制默认是不启用的,因此在默认的参数文件下列表参数均被注释####
  27. # slaveof <masterip> <masterport> ##指定主端ip和端口,用于创建一个镜像服务
  28. # masterauth <master-password> ##如果master配置了密码的话,此处也需做设置;
  29. slave-serve-stale-data yes ##默认值yes。当slave丢失与master端的连接,或者复制仍在处理,那么slave会有下列两种表现:
  30. #当本参数值为yes时,slave为继续响应客户端请求,尽管数据已不同步甚至没有数据(出现在初次同步的情况下)
  31. #当本参数值为no时,slave会返回"SYNC with master in progreee"的错误信息;
  32. slave-read-only yes ##默认从Redis是只读模式
  33. # repl-ping-slave-period 10 ###默认值10,指定slave定期ping master的周期;
  34. # repl-timeout 60 ##默认值60,指定超时时间。注意本参数包括批量传输数据和ping响应的时间。
  35. ####安全相关的设置####
  36. # requirepass foobared ###指定一个密码,客户端连接时也需要通过密码才能成功连接;
  37. # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 ###重定义命令,例如将CONFIG命令更名为一个很复杂的名字:
  38. # rename-command CONFIG "" 取消这个命令;
  39. ####资源限制方面的设置###
  40. # maxclients 10000 #指定客户端的最大并发连接数,默认是没有限制,直到redis无法创建新的进程为止,设置该参数值为0也表示不限制,如果该参数指定了值,当并发连接达到指定值时,redis会关闭所有新连接,并返回'max number of clients reached'的错误信息;
  41. # maxmemory <bytes> #设置redis最大可使用内存。当达到最大内存后,redis会尝试按照设置的回收策略删除键值。如果无法删除键值,或者保留策略设置为不清除,那么redis就会向发出内存的请求返回错误信息。当把redis做为一级LRU的缓存时本参数较为有用。
  42. # maxmemory-policy volatile-lru ###默认值volatile-lru,指定清除策略,有下列几种方法:
  43. volatile-lru -> remove the key with an expire set using an LRU algorithm
  44. allkeys-lru -> remove any key accordingly to the LRU algorithm
  45. volatile-random -> remove a random key with an expire set
  46. allkeys->random -> remove a random key, any key
  47. volatile-ttl -> remove the key with the nearest expire time (minor TTL)
  48. noeviction -> don not expire at all, just return an error on write operations
  49. # maxmemory-samples 3 #默认值3,LRU和最小TTL策略并非严谨的策略,而是大约估算的方式,因此可以选择取样值以便检查。
  50. ####APPEND的配置-####
  51. ONLY模式的设置,默认情况下redis采用异步方式dump数据到磁盘上,极端情况下这可能会导致丢失部分数据(比如服务器突然宕机),如果数据比较重要,不希望丢失,可以启用直写的模式,这种模式下redis会将所有接收到的写操作同步到appendonly.aof文件中,该文件会在redis服务启动时在内存中重建所有数据。注意这种模式对性能影响非常之大。
  52. appendonly no ##默认值no,指定是否启用直写模式;
  53. # appendfilename appendonly.aof ###直写模式的默认文件名appendonly.aof
  54. appendfsync:调用fsync()方式让操作系统写数据到磁盘上,数据同步方式,有下列几种模式:
  55.     always:每次都调用,比如安全,但速度最慢;
  56.     everysec:每秒同步,这也是默认方式;
  57.     no:不调用fsync,由操作系统决定何时同步,比如快的模式;
  58.     no-appendfsync-on-rewrite:默认值no。当AOF fsync策略设置为always或everysec,后台保存进程会执行大量的I/O操作。某些linux配置下redis可能会阻塞过多的fsync()调用。
  59.     auto-aof-rewrite-percentage:默认值100
  60.     auto-aof-rewrite-min-size:默认值64mb
  61. # appendfsync always
  62. appendfsync everysec
  63. # appendfsync no
还有很多其他的参数,难以一次性介绍完整,有心的朋友可以看看redis.cnf文件里面自带的介绍。

四 遇到的问题
1 编译的时候报错
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/root/redis-2.8.13/src'
解决方法
Selecting a non-default memory allocator when building Redis is done by setting the `MALLOC` environment variable. Redis is compiled and linked against libc malloc by default, with the exception of jemalloc being the default on Linux systems. This default was picked because jemalloc has proven to have fewer fragmentation problems than libc malloc.  
To force compiling against libc malloc, use:  
    % make MALLOC=libc  
To compile against jemalloc on Mac OS X systems, use:  
    % make MALLOC=jemalloc
编译的时候指定MALLOC=libc的方式
  1. root@rac4:~/redis-2.8.13# >make MALLOC=libc
  2. cd src && make all
2 因为我的是虚拟机,内存只有500M,上面安装了MySQL 导致系统内存不足,刚刚启动报错
[22270] 11 May 09:52:10.453 # Server started, Redis version 2.8.13
[22270] 11 May 09:52:10.458 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[22270] 11 May 09:52:10.458 * The server is now ready to accept connections on port 6379
解决方法
  按照提示执行 sysctl vm.overcommit_memory=1 。这里科普一下 vm.overcommit_memory
默认值为:0
该参数有三个值,分别是:
0:当用户空间请求更多的的内存时,内核尝试估算出剩余可用的内存。
1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算
2:当设这个参数值为2时,内核会使用一个决不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。
关于 vm.overcommit_ratio
默认值为:50
这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。

正文到此结束
Loading...