一、Redis介绍
1、Redis是一个key-value存储系统
2、官方站点http://redis.io
3、Redis和Memcached类似,但支持数据持久化
4、支持更多value类型,除了string外,还支持hash、lists(链表)、sets(集合)、和sorted sets(有序集合)几种数据类型
5、Redis使用两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据
6、Redis的存储分为内存存储、磁盘存储和log文件三部分
二、Redis下载安装配置
# wget ‘https://codeload.github.com/antirez/redis/tar.gz/2.8.21‘ -O redis-2.8.21.tar.gz
# tar zxvf redis-2.8.21.tar.gz
# cd redis-2.8.21
# make
# make PREFIX=/usr/local/redis install
# mkdir /usr/local/redis/etc
# wget http://www.apelearn.com/study_v2/.redis_conf -O /usr/local/redis/etc/redis.conf 2> /dev/null
# wget http://www.apelearn.com/study_v2/.redis_init -O /etc/init.d/redis 2> /dev/null
# useradd -s /sbin/nologin redis && mkdir /usr/local/redis/var && chmod 777 /usr/local/redis/var && chmod 755 /etc/init.d/redis
# chkconfig --add redis
# chkconfig redis on
# service redis start
三、Redis数据结构
1、Redis数据类型-string
l string是最简单的类型,你可以理解成与Memcached一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似,他的功能更丰富。设置可以存二进制的对象。
l 示例
# redis-cli set mykey "fanjinbao"
# redis-cli get mykey "fanjinbao"
"fanjinbao"
也可以进入redis的终端进行创建
# redis-cli
127.0.0.1:6379> mset key1 zhangsan key2 lisi key3 hello
127.0.0.1:6379> mget key1 key2 key3
1) "zhangsan"
2) "lisi"
3) "hello"
2、Redis数据类型-list
l list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字,使用List结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的TimeLine)。list的另一个应用就是消息队列,可以利用list的push操作,将任务存在list中,然后工作线程再用pop操作将任务取出进行执行。
l 示例
左侧插入
# redis-cli lpush list aaa
左侧取值
# redis-cli lpop list
右侧插入
# redis-cli rpush list lisi
右侧取值
# redis-cli rpop list
查看所有list值
# redis-cli lrange list 0 -1
3、Redis数据类型-set
l set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为Redis非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面所有集合的操作,你还可以使用不同的命令选择将结果返回给客户端还是存到一个新的集合中。QQ有一个社交功能叫“好友标签”,可以个你的好友贴标签,比如“大美女”、“土豪”,“欧巴”等等,这时可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
l 示例
往集合中添加元素
# redis-cli sadd set1 abc
列出集合中的元素(无序显示)
# redis-cli smembers set1
4、Redis数据类型-sort set
l sort set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sort set,其集合value可以是同学的学号,而score就可以是其考试得分,这样的数据插入集合的时候,就已经进行了天然的排序
l 示例
往集合中添加元素
# redis-cli zadd set2 12 abc
# redis-cli zadd set2 2 "cde 123"
# redis-cli zadd set2 24 123-aaa
# redis-cli zadd set2 4 a123a
列出集合中的元素(按权重参数排列升序)
# redis-cli zrange set2 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
列出集合中的元素(按权重参数降序)
# redis-cli zrevrange set2 0 -1
5、Redis数据类型-hash
l 在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户名的昵称、年龄、性别、积分等。
l 示例
往集合中添加元素
# redis-cli hset hash name fanjinbao
# redis-cli hset hash age 31
取集合中的元素
# redis-cli hget hash name
# redis-cli hget hash age
列出所有元素
# redis-cli hgetall hash
四、Redis持久化
1、Redis提供了两种持久化的方式,分别是RDB(Redis DataB)和AOF(Append Only File)
2、RDB,简而言之,就是不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。
3、AOF,则是换了一个角度来实现持久化,那就是将redis执行过得所有写指令记录下来,在下次redis重新启动时,只要把这些指令从前到后再重复执行一遍,就可以实现数据恢复。
4、其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
5、如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis就变成一个纯内存数据库,就像Memcached一样
五、Redis配置
查看Redis配置信息
127.0.0.1:6379> config get *
Redis的基本配置参数:
daemonize no #默认情况下,redis并不是以daemon形式来运行的。通过daemonize配置项可以控制redis的运行形式
pidfile /path/to/redis.pid #当以daemon形式运行时,redis会生成一个pid文件,默认会生成在/var/run/redis.pid
bind 192.168.1.201 192.168.1.202 #指定绑定的ip,可以有多个
port 6379 #默认端口
unixsocket /tmp/redis.sock #也可以监听socket
unixsocketperm 755 #当监听soket时可以指定权限为755
timeout 0 #当一个redis-client一直没有请求发现server端,那么server端有权主动关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭
tcp-keepalive 0 #TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,加入设置60秒想连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接,如果设置为0,则不会进行保活检测。
loglevel notice #日志级别,有四种debug、verbose、nbotice、warning
logfile “” #定义日志路径
syslog-ident redis #如果希望日志打印到syslog中,通过syslog-enable来控制,另外,syslog-ident还可以让你指定syslog里的日志标志。
syslog-facility local0 #指定syslog的设备,可以是USER或者local0-local7
databases 16 #设置数据库的总数量,select n选择数据库,0-15
Redis快照配置(rdb持久化)
save 900 1 #表示表示每15分钟且至少1个key改变,就触发一次持久化
save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久化
save 300 10 #表示每5分钟且至少10个key改变,就触发
save "" #这样就可以禁用rdb持久化
stop-writes-on-bgsave-error yes #rdb持久化写入磁盘避免不了会出现失败的情况,默认一旦出现失败,redis会马上停止写操作,如果你觉得无所谓,那就可以使用该选项关闭这个功能。
rdbcompression yes #是否要压缩
rdbchecksum yes #是否进行数据校验
dbfilename dump.rdb #定义快照文件的名字
dir ./ #定义快照文件存储路径
Redis安全相关配置
requirepass fansik #设置redis-server的密码
如果设置了密码,登录方式:
# redis-cli -a fansik
rename-command CONFIG fansik.config #将CONFIG命令更名为fansik.conf,这样就可以避免误操作,但如果使用了AOF持久化,建议不要启用该功能
rename-command CONFIG "" #也可以后面定义为空,这样就可以禁掉CONFIG命令
Redis限制相关配置
maxclients 10000 #限制最大客户端连接数
maxmemory <bytes> #设定最大内存使用数,单位是byte
maxmemmory-policy volatile-lru #指定内存移除规则
maxmemory-samples 3 #LRU算法和最小TTL算法都并非是精确的算法,而是估值,所以可以设置样本的大小,加入redis默认会检查三个key并选择其中的LRU的那个,那么你可以改变这个key样本的数量
Redis AOF持久化相关配置
appendonly on #如果是yes,则开启aof持久化
appendfilename "appendonly.aof" #指定aof文件名字,保存在dir参数指定的目录
appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync),第一种最快,第二种数据最安全,但性能会差一些,默认为第三种
no-appendfsync-on-rewrite no #使用no可避免当写入量非常大时的磁盘io阻塞
auto-aof-rewrite-percentage 10 #规定什么情况下会出发aof重写。改值为一个比例,10表示当aof文件增幅达到10%时则会触发重写机制
auto-aof-rewrite-min-size 64mb #重写会有一个条件,就是不能低于64mb
Redis慢日志相关配置
针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令队列中被移除
slowlog-log-slower-than 10000 #慢于10000ms则记录日志
slowlog-max-len 128 #日志长度(条数)