安装:
yum install gcc-c++
yum install -y tcl
wget http://download.redis.io/releases/redis-3.2.3.tar.gz
tar xzf redis-3.2.3.tar.gz
cd redis-3.2.3
make
make install
拷贝配置文件
mkdir -p /etc/redis
cp redis.conf/etc/redis
vi /etc/redis/redis.conf//根据需要修改,如: daemonize yes (no-->yes)让server以守护进程在后台执行。
redis-server /etc/redis/redis.conf //根据指定的配置文件启动,redis-server 根据默认配置文件启动
ps -ef | grep redis //查看是否启动
redis-cli // 启动客户端,远程:$ redis-cli -h host -p port -a password
127.0.0.1:6379> ping
PONG
启动成功
参数:
在cli端查看配置参数
* 号是查看所有参数。
有些参数在运行后不可以修改。
daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes
daemonize yes
当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,需要指定不同的pid文件和端口
pidfile /var/run/redis.pid
指定redis运行的端口,默认是6379
port 6379
指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求。
bind的是redis所在服务器网卡的ip。也就是说,如果你的redis服务器有两张网卡,一张是ip-1,另一张是ip-2,如果你bind ip-1.那么只有请求ip-1的请求会被受理。例如在IP为128.199.173.52的机器上设置了 bind 128.199.173.52,在另一台机器上可以通过redis-cli -h 128.199.173.52 -p 6379 -a password 访问。
bind 127.0.0.1
设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
0是关闭此设置
timeout 0
指定日志记录级别
Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
debug 记录很多信息,用于开发和测试
varbose 有用的信息,不像debug会记录那么多
notice 普通的verbose,常用于生产环境
warning 只有非常重要或者严重的信息会记录到日志
loglevel debug
配置log文件地址
默认值为stdout,标准输出,若后台模式会输出到/dev/null
logfile stdout
logfile /var/log/redis/redis.log
可用数据库数
默认值为16,默认数据库为0,数据库范围在0-(database-1)之间
databases 16
保存数据到磁盘,格式如下:
save <seconds> <changes>
指出在多长时间内,有多少次更新操作,就将数据同步到数据文件rdb。
相当于条件触发抓取快照,这个可以多个条件配合
比如默认配置文件中的设置,就设置了三个条件
save 900 1 900秒内至少有1个key被改变
save 300 10 300秒内至少有300个key被改变
save 60 10000 60秒内至少有10000个key被改变
save 900 1
save 300 10
save 60 10000
存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes
rdbcompression yes
本地持久化数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
工作目录
数据库镜像备份的文件放置的路径。
这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,
再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
AOF文件也会存放在这个目录下面
注意这里必须指定一个目录而不是文件
dir ./
主从复制. 设置该数据库为其他数据库的从数据库.
设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
当master服务设置了密码保护时(用requirepass制定的密码)
slav服务连接master的密码(在slave端配置)
masterauth <master-password>
当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
- 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
- 如果slave-serve-stale-data是指为no,出去INFO和SLAVOF命令之外的任何请求都会返回一个
错误"SYNC with master in progress"
slave-serve-stale-data yes
从库会按照一个时间间隔向主库发送PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒
repl-ping-slave-period 10
repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒
一定要确保repl-timeout大于repl-ping-slave-period
repl-timeout 60
设置客户端连接后进行任何其他指定前需要使用的密码。
警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解
requirepass password
设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,
如果设置 maxclients 0,表示不作限制。
当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 0
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key
Redis同时也会移除空的list对象
当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作
注意:Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用,而不适合当做一个真实的DB。
当把Redis当做一个真实的数据库使用的时候,内存使用将是一个很大的开销
maxmemory <bytes>
当内存达到最大值的时候Redis会选择删除哪些数据?有五种方式可供选择
volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
allkeys-lru -> 利用LRU算法移除任何key
volatile-random -> 移除设置过过期时间的随机key
allkeys->random -> 随机key
volatile-ttl -> 移除即将过期的key(minor TTL)
noeviction -> 不移除任何可以,只是返回一个写错误
注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误
写命令包括: set setnx setex append
incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
getset mset msetnx exec sort
默认是:
maxmemory-policy volatile-lru
LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存),随意你可以选择样本大小进行检测。
Redis默认的灰选择3个样本进行检测,你可以通过maxmemory-samples进行设置
maxmemory-samples 3
默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。
开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重新整理。
你可以同时开启asynchronous dumps 和 AOF
appendonly no
AOF文件名称 (默认: "appendonly.aof")
appendfilename appendonly.aof
Redis支持三种同步AOF文件的策略:
no: 不进行同步,系统去操作 . Faster.
always: always表示每次有写操作都进行同步. Slow, Safest.
everysec: 表示对写操作进行累积,每秒同步一次. Compromise.
默认是"everysec",按照速度和安全折中这是最好的。
如果想让Redis能更高效的运行,你也可以设置为"no",让操作系统决定什么时候去执行
或者相反想让数据更安全你也可以设置为"always"
如果不确定就用 "everysec".
appendfsync everysec
AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理
为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
AOF 自动重写
当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写
它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)
基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
设置 percentage 为0就关闭这个特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当hash中包含超过指定元素个数并且最大的元素没有超过临界时,
hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,
这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,
如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。
hash-max-zipmap-entries 64
如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式。
hash-max-zipmap-value 512
list数据类型多少节点以下会采用去指针的紧凑存储格式。
list数据类型节点值大小小于多少字节会采用紧凑存储格式。
list-max-ziplist-entries 512
list-max-ziplist-value 64
set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
set-max-intset-entries 512
zsort数据类型多少节点以下会采用去指针的紧凑存储格式。
zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用
当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
activerehashing yes
指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
include /path/to/other.conf
数据类型:
string
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
get key(根据k得到v),set key value(设置kv)。
incr(v加1),decr(v减1),incrby(v和参数做加法),decrby(v和参数做减法)。
setnx key value(k不存在才设置),setn key value xx(k存在才设置)。
mset(插入多个kv),mget(获取多个k的v)。
getset(得到原来的v,插入新v),append(在原v上追加),strlen(v的长度)。
incrbyfloat(v与浮点相加),getrange(v的字符范围),setrange(更改v的部分字符)。
hash
hset (设置hash属性),hget(得到hash属性),hdel(删除哈希属性),hgetall(得到hash类型的v,不能用get)。
hexists(判断hash属性存在),hlen(hash属性个数)
hmset,hmget(批量设置,取出hash的属性)
hincrby(hash属性的加法)
hgetall(得到所有hash的kv),hvals(得到所有hash的v),hkeys(得到所有hash的k)
list
lpush/lpop栈。lpush/rpop队列。
rpush:从右侧插入list
linsert:在某值的前或后插入
lpop:从左侧弹出
lrange:取出list指定下标范围的值
lrem key count value:删除count个和value一样的值。count>0从左到右。count<0,从右到左。count=0,删除所有。
ltrim key start end: 根据索引范围修剪表。
lindex key index:根据索引取出值。
llen key:得到list的长度。
lset key index value:根据索引设值。
set
sadd打标签。spop/srandmember得到随机值。sinter社交关系。
sadd key value:想集合中插入,已存在则失败。
srem key value:删除集合中的指定value。
scard key:返回集合大小。
sismember key value:是否存在value,1为存在。
spop key count:随机删除集合中的count个value。
smember key:返回集合的所有数据。
srandmember key count:随机返回count个集合中的数据。
sdiff set set:差集。
sinter set set:交集。
sunion set set:并集。
sorted set
zadd key score value:插入有序集合,可以是多对。
zscore key value:得到分数。
zincrby key score value:分数加法。
zcard key:得到集合的元素个数。
zrank key value:验证value是否存在。
zrange key start end withscores:根据索引取出集合的元素。
zrem key value:根据value删除元素。
zrangebyscore key minscore maxscore withscores:取出范围内的元素。
zcount key minscore maxscore:统计范围内的个数。
zremrangebyrank key startend:根据升序删除指定索引的元素
其他键值操作:
type key:返回value的类型。
del key:删除对应的键值对。
exist key:键值是否存在。
rename key newkey:重新命名key,原key必须存在。
expire key num:设置时效。
ttl key:查看剩余时效。没有时效为-1,过期为-2。
dbsize:键值对的数量。
keys *:查看所有key。和smenbers一样是长命令,尽量不用。
select num:选择数据库(0-15),默认使用0库。不建议使用多库,建议采用多实例。
scan cursor :cursor设为0表示重新开始迭代。的返回值是一个包含两个元素的数组, 第一个数组元素是用于进行下一次迭代的新游标, 而第二个数组元素则是一个数组包含了所有被迭代的元素。当服务器向用户返回值为 0 的游标时, 表示迭代已结束。
scan cursor count num:用户可以通过增量式迭代命令提供的COUNT选项来指定每次迭代返回元素个数的上限。
scan cursor match pattern:匹配工作是在命令从数据集中取出元素后进行的, 所以或许会在多次执行中都不返回任何元素。
要点:
启动服务端:redis-server /etc/redis/redis.conf
启动客户端:redis-cli -h 128.199.173.52 -p 6379 & redis-cli -h 128.199.173.52 -p 6379 -a password
退出客户端:exit
关闭服务端:shutdown
绑定IP:bind的是redis所在服务器网卡的ip
设置密码:requirepass password
string
set key value
get key value
mset key1 value1 key2 value2
mget key1 key2
incr key
decr key
append key value
hash
hset user:1 age 25
hget user:1 age
hdel user:1 age(如果最后一个属性被删除,user:1也被删除)
hgetall user:1
hmset user:1 age 25 name aaa
hmget user:1 age name
list
lpush key value
rpush key value
lpop key value
rpop key value
lrange key 0 -1
lindex key 5
lset key index value
llen key
删除指定下标的数据
lset ListKey index "deleted"
lrem ListKey 0 "deleted"
set
sadd key value
srem key value
scard key 返回集合大小
sismember key value 是否存在value,1为存在
smember key 返回集合的所有数据
sorted set
zadd key score value
zscore key value 得到分数
zincrby key score value 分数加法
zcard key 得到集合的元素个数
zrange key start end withscores 根据索引取出集合的元素
zrem key value 根据value删除元素