=============================================================
编译安装
0、环境
Linux:centos6.5
redis:3.0.5
1、下载
方式一:官网下载war包,通过xftp拷贝到linux服务器,解压;
方式二:linux服务器,执行命令 wget http://download.redis.io/releases/redis-3.0.5.tar.gz
2、编译
2.1 解压
tar -zxvf redis-3.0.5.tar.gz
2.1 编译
cd redis-3.0.5/ make
make install 程序会被复制到/usr/local/bin目录内,在命令行中直接输入程序命令即可执行,可省略
2.3 测试是否成功
cd src
./redis-server
新打开一个终端窗口,执行命令:./redis-3.0.5/src/redis-cli
set foo bar
get foo
安装错误解决:
https://blog.csdn.net/wenwen360360/article/details/70162169
https://blog.csdn.net/libra_ts/article/details/71195128
可执行文件: src目录下
redis-server Redis服务器
redis-cli 命令行客户端
redis-benchmark 性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件检查工具
启动Redis
直接启动,适用开发环境
运行redis-server
redis-server --port 6380
redis-server /path/redis.conf
通过初始化脚本启动,适用生产环境
在Linux中可以通过初始化脚本启动Redis,使得Redis能随系统自动运行,在生产环境推荐此方法。在Reids源代码目录的utils文件夹中有一个名为redis_init_script的初始化脚本,具体参考:Linux下Redis开机自启(Centos),https://blog.csdn.net/qq_27631797/article/details/79082591。
停止Redis
考虑到Redis有可能正在将内存中的数据同步到硬盘中,强行终止Redis进程可能会导致数据丢失,正确停止是向Redis发送shutdown命令,redis-cli shutdown。当redis收到shutdown命令后,会先断开所有客户端连接,然后根据配置执行持久化,最后完成退出。
配置
模板redis.conf,位于源代码的根目录中。可以在redis运行时通过CONFIG SET命令在不重启Redis的情况下动态修改Redis配置,不上所有配置都可以。
=============================================================
命令
命令不区分大小写
keys pattern,pattern支持glob风格通配符,如?,*,[],x等;生产环境不建议keys *,因为会遍历所有键,影响性能
exists key,判断键是否存在,存在返回1,否则返回0
del key[key ...],删除一个或多个键,返回值是删除的键的个数,del命令不支持通配符,可以结合linux的管道和xargs命令自己实现删除符合规则的键,如redis-cli keys "user*" | xargs redis-cli del
type key,获取键值的数据类型
字符串类型
set key value,赋值,存在则覆盖
get key,取值,不存在会返回空结果
incr key,递增数字,键不存在默认值为0;所有的redis命令都是原子操作
键的命名,推荐 “对象类型:对象ID:对象属性”,如user:1:friends,多个单词用“.”分割
incrby key increment,增加指定的整数
decr key,递减数字
decrby key decrement,减少指定的整数
incrbyfloat key increment,递增一个双精度浮点数
append key value,向尾部追加值
strlen key,获取字符串长度
mget key [key ...],同时获取多个键值
mset key value [key value ...],同时设置多个键值
getbit key offset
setbit key offset value
bitcount key [start] [end]
bitop operation destkey key [key ...] ,上述四个命令都是关于位操作,直接对二进制位进行操作。
散列类型
适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。
hset key field value
hget key field
hmset key field value [field value ...]
hmget key field [field ...],赋值和取值,多个赋值和多个取值
hgetall key 获取所有字段和字段值
hexists key field 判断字段是否存在,存在返回1,否则返回0
hsetnx key field value,当字段不存在时赋值,nx表示“if Not eXists”(如果不存在);如果字段已经存在,hsetnx将不执行任何操作;原子操作
hincrby key field increment,可以使字段值增加指定的整数
hdel key field [field ...],可以删除一个或多个字段,返回值是被删除的字段个数。
hkeys key、hvals key,只获取字段名或字段值
hlen key,获取字段数量
列表类型
存储一个有序的字符串列表,想列表两端添加元素,或是获取列表的某一个片段。
lpush key value [value ...]、rpush key value [value ...],向列表两端增加元素
lpop key、rpop key,从列表两端弹出元素,从列表中移除,返回被移除的元素值
llen key,获取列表中元素的个数,直接读取现成的值
lrange key start stop,获取列表片段,返回索引从start到stop之间的所有元素(包括两端),索引从0开始,支持负索引,-1表示最右边第一个元素
lrem key count value,删除列表中指定的值,删除列表中前count个值为value的元素,返回值是实际删除的元素个数。count>0 从左侧删;count<0 从右侧删;count=0 删除所有
lindex key index,获得指定索引的元素值,索引从0开始
lset key index value,设置指定索引的元素值,索引从0开始
ltrim key start end,只保留列表指定片段,删除指定索引范围之外的所有元素;配合lpush一起使用来限制列表中元素的个数
linsert key before|after pivot value,向列表中插入元素,首先会在列表中从左到右查找值为pivot的元素,然后根据是before或after来决定将value插入到该元素的前面还是后面
rpoplpush source destination,将元素从一个列表转到另一个列表
集合类型
集合中每个元素都是不同的,且没有顺序
sadd key member [member ...],增加元素,返回值是成功加入的元素数量
srem key member [member ...],删除元素,返回删除成功的个数
smembers key,获取集合中的所有元素
sismember key member,判断元素是否在集合中,存在返回1
sdiff key [key ...],差集运算,集合A与集合B的差集表示A-B,属于A且不属于B的;多个值时,按先后顺序计算
sinter key [key ...],交集运算,表示A∩B,属于A且属于B
sunion key [key ...],并集运算,表示A∪B,属于A或属于B
scard key,获取集合中元素个数
sdiffstore destination key [key ...]
sinterstore destination key [key ...]
sunionstore destination key [key ...],上述三个命令是进行集合运算并将结果存储
srandmember key [count],随机获取集合中的元素,指定count可以一次随机获取多个元素,count>0,获取不重复的元素;count>集合元素个数,获取集合全部元素;count<0 有可能相同
spop key,从集合中弹出一个元素,随机选择
有序集合类型
zadd key score member [score member ...],增加元素
zscore key member,获取元素的分数
zrange key start stop [withscores],按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素,包括两端,索引从0开始,负数从后往前查找
zrevrange key start stop [withscores],同上,从大到小
zrangebyscore key min max [withscores] [limit offset count],获取指定分数范围的元素,如果不包含端点值,可以在分数前加上"("符号;-inf 和+inf表示负无穷和正无穷。
zrevrangebyscore key max min [withscores] [limit offset count],同上,从大到小
zincrby key increment member,增加某个元素的分数,返回更改后的分数
zcard key,获取集合中元素的数量
zcount key min max,获取指定分数范围内的元素个数
zrem key member [member ...],删除一个或多个元素,返回成功删除的元素数量
zremrangebyrank key start stop,按照排名范围删除元素,从小到大
zremrangebyscore key min max,按照分数范围删除元素
zrank key member,获取元素的排名,从小到大(从0开始,分数最小的元素排名为0)
zrevrank key member,从大到小
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [argegate sum|min|max],计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回destination键中的元素个数。当argegate 是sum时(默认值),destination 键中元素的分数是每个参与计算的集合中该元素分数的和;另外两个类似,取最小值或最大值。
=============================================================
事务
multi
命令1
命令2
...
exec
在命令执行时出现的错误,是可以被redis接受并执行的。
不支持回滚,需要开发者必须在事务出错后自己处理。
watch命令,可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到exec命令。
生存时间
expire key seconds,返回1表示设置成功,单位秒
ttl key,查看键的剩余时间
persist key,取消键的生存时间设置;除了persist命令,使用set或getset命令为键赋值也会同时清除键的生存时间
pexpire key milliseconds,单位为毫秒
pttl key,单位为毫秒
排序
sort命令,可以对列表、集合、有序集合进行排序;还可以通过ALPHA参数实现按照字典顺序排列非数字元素,如 sort listA ALPHA
选项 desc,从大到小排序
选项limit offset count,跳过前offset个元素并获取之后的count个元素
参数by,语法为“by 参考键”,其中参考键可以是字符串类型键或是散列类型键的某个字段(表示为键名 -> 字段名)。如果提供了by参数,sort命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个"*"并获取其值,然后依据该值对元素排序;当参考键名不包含“*”时(即常量键名),sort命令将不会执行排序操作;如果几个元素的参考键值相同,则sort命令会再比较元素本身的值来决定元素的顺序;当某个元素的参考键不存在时,会默认参考键的值为0;
参数get,不影响排序,使sort命令的返回结果不再是元素自身的值,而是get参数中指定的键值。get参数的规则和by参数一样,也支持字符串类型和散列类型的键,并使用“*”作为占位符;在一个sort命令中可以有多个get参数;get #会返回元素自身的值;
参数store,默认情况下sort会直接返回排序结果,如果希望保存排序结果,可以使用store参数;保存后的键的类型为列表类型,如果键已经存在则会覆盖它。加上store参数后sort命令的返回值为结果的个数
管道
通过管道可以一次性发送多条命令并在执行完后一次性将结果返回,可以减少客户端与Redis的通信次数,降低往返时延累计值。
节省空间
精简键名和键值
内部编码优化,Redis为每种数据类型都提供了两种内部编码方式
=============================================================
redis.conf 配置项说明:
1、daemonize no
是否把redis-server在后台启动,默认是“否”,改为yes,会生成一个pid文件
2、pidfile
/var/run/redis.pid,redis-server的pid文件。
3、port
redis-server的端口号
4、dbfilename dump.rdb
数据库文件的位置,最好添加绝对路径,若不添加时在启动用户的home目录下
5、slaveof
设置主从服务器的主服务器的地址和端口
6、loglevel verbose
日志级别,debug,verbose,notice,warning
7、logfile stdout
日志的输出文件,默认是标准输出。例如:logfile /tmp/redis.log
8、bind 0.0.0.0 可以使外部访问该redis
9、protected-mode no 根据情况使用
=============================================================
主从配置
工作原理:
在Slave启动并连接到Master之后,它将主动发送一条SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
***同一台机器的主从配置***
***不同机器的主从配置***
(1)同一台机器的主从配置
1、在同一台机器上启动两个Redis服务器,分别监听不同的端口
2、环境说明
master 6379,slave 6380
3、修改配置文件
拷贝一份redis.conf,cp redis.conf redis_slave.conf
修改redis_slave.conf,把端口修改为6380;把slaveof 修改为 slaveof 127.0.0.1 6379
4、测试
#启动master服务器,即6379端口的服务器 ./src/redis.server redis.conf #启动slave服务器,即6380端口的服务器 ./src/redis.server redis_slave.conf #启动master客户端 ./src/redis.cli -h 127.0.0.1 -p 6379 #启动slave客户端 ./src/redis.cli -h 127.0.0.1 -p 6380 #清空master当前数据库中的所有Keys 127.0.0.1:6379> FLUSHDB #master中创建key 127.0.0.1:6379> set foo aaa OK 127.0.0.1:6379> set foo2 bbb OK #查看master中存在哪些Keys 127.0.0.1:6379> keys * 1) "foo" 2) "foo2" #在slave中查看keys 127.0.0.1:6380> keys * 1) "foo2" 2) "foo" #在master中删除其中一个测试Key,并查看删除后的结果。 127.0.0.1:6379> del foo (integer) 1 127.0.0.1:6379> keys * 1) "foo2" #在slave中查看是否foo也已经在slave中被删除。 127.0.0.1:6380> keys * 1) "foo2"
#查看同步状态主从关系
127.0.0.1:6379> info
内容比较多,只关注需要的:Replication项
(2)不同机器的主从配置
配置方式和同一台机器的配置方式基本一样,只是ip不是同一台机器而已。
=============================================================
其他知识点
1、Redis服务的集中监控(redis-live的使用)
2、Redis主从自动failover(keepalive),参考:http://www.tuicool.com/articles/eu26Vz
3、