1.安装Redis
Linux下安装:
tar -xzf redis-4.0.1.tar.gz
cd redis-4.0.1
make
make install
2.Redis各进程
编译安装成功后会生成下面几个可执行程序:
redis-server redis服务器进程
redis-cli redis命令行客户端
redis-benchmark redis基准测试工具
redis-check-aof redis AOF 持久化文件检测和修复工具
redis-check-dump redis RDB 持久化文件检测和修复工具
redis-sentinel redis哨兵机制启动进程
3.Redis配置文件
redis.conf和sentinel.conf,一般都放在/etc/redis 目录下
# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。daemonize yes
# 监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
# 默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。
# 你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。
#
# 示例,多个IP用空格隔开:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
# 指定在一个 client 空闲多少秒之后关闭连接(0 就是不管它)
timeout 0
# tcp 心跳包。
#
# 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。
# 这个之所有有用,主要由两个原因:
#
# 1) 防止死的 peers
# 2) Take the connection alive from the point of view of network
# equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 60 seconds.
# 推荐一个合理的值就是60秒
tcp-keepalive 0
# 定义日志级别。
# 可以是下面的这些值:
# debug (适用于开发或测试阶段)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (适用于生产环境)
# warning (仅仅一些重要的消息被记录)
loglevel notice
# 指定日志文件的位置
logfile ""
# 设置数据库的数目。
# 默认数据库是 DB 0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库,
# 但是 dbid 必须是一个介于 0 到 databasees - 1 之间的值
databases 16
################################ 快照 ################################
#
# 存 DB 到磁盘:
#
# 格式:save <间隔时间(秒)> <写入次数>
#
# 根据给定的时间间隔和写入次数将数据保存到磁盘
#
# 下面的例子的意思是:
# 900 秒内如果至少有 1 个 key 的值变化,则保存
# 300 秒内如果至少有 10 个 key 的值变化,则保存
# 60 秒内如果至少有 10000 个 key 的值变化,则保存
#
# 注意:你可以注释掉所有的 save 行来停用保存功能。
# 也可以直接一个空字符串来实现停用:
# save ""
save 900 1
save 300 10
save 60 10000
# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,
# 这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,
# 否则就会没人注意到灾难的发生。
#
# 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。
#
# 然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。
stop-writes-on-bgsave-error yes
# 是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串
# 默认都设为 yes
# 如果你希望保存子进程节省点 cpu ,你就设置它为 no ,
# 不过这个数据集可能就会比较大rdbcompression yes
# 是否校验rdb文件rdbchecksum yes
# 设置 dump 的文件位置dbfilename dump.rdb
# 工作目录
# 例如上面的 dbfilename 只指定了文件名,
# 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。
dir ./
################################# 主从复制 #################################
# 主从复制。使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本。
# 注意这个只需要在 slave 上配置。
#
slaveof <masterip> <masterport>
# 如果 master 需要密码认证,就在这里设置
masterauth <master-password>
# 你可以配置一个 slave 实体是否接受写入操作。
# 通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的,
# 因为相对从 master 重新同步数而言,据数据写入到 slave 会更容易被删除。
# 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。
#
# 从 redis 2.6 版起,默认 slaves 都是只读的。
#
slave-read-only yes
# 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,
# 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。
#
# 默认优先级为 100。
slave-priority 100
# 设置认证密码
requirepass foobared
# 一旦达到最大限制,redis 将关闭所有的新连接
# 并发送一个‘max number of clients reached’的错误。
#
maxclients 10000
# 如果你设置了这个值,当缓存的数据容量达到这个值, redis 将根据你选择的
# eviction 策略来移除一些 keys。
#
# 如果 redis 不能根据策略移除 keys ,或者是策略被设置为 ‘noeviction’,
# redis 将开始响应错误给命令,如 set,lpush 等等,
# 并继续响应只读的命令,如 get
#
# This option is usually useful when using Redis as an LRU cache, or to set
# a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# 最大使用内存
# maxmemory <bytes>
# 最大内存策略,你有 5 个选择。
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# volatile-lru -> 使用 LRU 算法移除包含过期设置的 key 。
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# allkeys-lru -> 根据 LRU 算法移除所有的 key 。
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# noeviction -> 不让任何 key 过期,只是给写入操作返回一个错误
#
# The default is:
#
maxmemory-policy noeviction
Redis哨兵机制的配置sentinel.conf:
后续有章节详解哨兵机制。
#后台运行
daemonize yes
#sentinel绑定IP
bind 172.16.0.201
#sentinel使用端口号
port 26379
#工作目录
dir "/tmp"
#日志文件
logfile "/var/log/sentinel.log"
#sentinel节点监控地址为172.16.0.201端口号为6379 的主节点mymaster ,如果两个或#者以上的sentinel节点认为mymaster 不可达,则置主节点mymaster为客观下线,需要#进行故障转移
sentinel monitor mymaster 172.16.0.201 6379 2
#每个sentinel节点通过ping命令判断Redis数据节点或者其他sentinel节点是否可达,超过该配置时间未有应答,则认为节点不可达。
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 10000
sentinel auth-pass mymaster 123456
sentinel parallel-syncs mymaster 1
sentinel config-epoch mymaster 91
sentinel notification-script mymaster /var/redis/notify.sh
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
还有些自动生成的配置:
sentinel myid 95f2141981197399a079e13488310f7e4d5d1656
sentinel leader-epoch mymaster 91
sentinel known-slave mymaster 172.16.1.168 6379
sentinel known-slave mymaster 172.16.1.160 6379
sentinel known-sentinel mymaster 172.16.1.168 26382 e9fdd43c4225819db03333d2c43f10f08c04745e
sentinel known-sentinel mymaster 172.16.1.160 26381 39f38da201d6520a26eb45f6e2bd223507781a20
sentinel current-epoch 91
4.启动停止Redis
启动redis服务:
启动服务有多种方式,这里建议就用这一种,通过设置配置文件启动
# redis-server /etc/redis/redis.conf
检查是否启动成功,一是看端口号是否启动,二是看日志,日志和端口号都是在配置文件里配置的。
停止redis服务:
最优雅的方式
# redis-cli -h 172.16.0.201 -p 6379 -a 123456 shutdown
Shutdown 后面可以带nosave或者save 来决定要不要退出时持久化,默认nosave
建议不能用kill -9 的方式,容易造成内存库数据丢失,如果正在持久化时,可能造成数据库文件损坏。可以用Kill 进程号的方式。
redis命令行客户端:
交互方式
#redis-cli -h{ip} -p{port} -a{password}
客户端连上数据库后,手输入命令操作数据库
命令方式
#redis-cli -h{ip} -p{port} -a{password} {command}
后面带命令直接运行,返回命令运行结果。
5.应用
Redis是内存数据库,直观感觉和sqlite内存库有一定相似性,由于使用广泛,比sqlite强大很多,redis是一个实用性很强的内存数据库,相当于把一些其他数据库需要sql语句实现的功能,直接就提供接口了。这里列出一些比较有特点的功能:
1.单线程;
2.键功能:删除、是否存在、设置TTL、查询TTL,查找符合条件key,key改名,扫描key
3.字符串功能强大:设置,获取,追加,批量设置,批量获取,设置子串,获取子串,增减
4.Hash:对应关系表,删除,取,取所有,增加,取所有key,key数量,批设置,批获取,扫描
5.列表:栈队列消息队列,左右入,同时入出,返回指定下标元素值,列表长度,移除指定值,设置指定下标值,
6.集合:无序无重复,获取群组成员并集交集,增加一个或多个成员,删除一个或多个成员,返回成员数量,返回全部成员,返回成员到集合,返回多个集合交集(或到集合),判断member是否成员,将成员从一个集合到另一个集合,随机取一个成员,返回并集(或到集合),扫描成员
7.有序集合:基于集合,每个元素有对应分数,个元素分数可以相同,分数作为排序依据,添加一个或多个成员,返回成员个数,返回对应分数段成员,返回成员排名,移除分数段的成员,
8.发布订阅,订阅频道,发布消息。(后继sentinel用到此机制)
9.事务:可以多个操作在一个事务中执行。使用watch可以关注相关键值是否修改,如果修改事务取消。缺点:每个提交命令都和服务器有交互。
10.连接:auth密码鉴权,选择数据库(缺省15个,可配置),ping pong测试,中断。
11.Pipeline:支持多命令与服务器一次交互,但非原子操作,适合单客户端。
12.持久化:一般应用RDB足够,断电,不频繁时丢几秒,大IO可能丢几分钟数据,fork进行内存保存。AOF多种配置,如果每秒方式,理论丢两秒数据,也是fork进行持久化。
13.主从:主机,从机。如果需要自动化切换,则还需哨兵机制。
14.集群:如果单机内存,并发不满足,则需要cluster进行解决,