Redis
直接进入主题吧
配置 redis 运行环境
Linux - CentOS 7 64 位,安装 Redis
- 将下载后的压缩包上传至 Linux 系统中。
- 解压安装包到
usr/local目录:tar -zxvf filename.tar.gz -C /usr/local - 进入到解压后的
redis目录:cd /usr/local/redis-xxx - 编译
Redis文件,Redis是 c 语言写的,会用到 gcc 编译器,执行make- 会出现两个错误
- 错误一:gcc 命令找不到,
gcc: Command not found - 解决错误一:
yum -y install gcc - 错误二:error: jemalloc/jemalloc.h: No such file or directory
- 解决错误二:
make MALLOC=libc
- 错误一:gcc 命令找不到,
- 会出现两个错误
- 执行
make distclean清理上次make后产生的文件 - 执行
make命令进行编译,成功的标志:make[1]:Leaving directory '/usr/local/redis-3.2.9/src' - 注意:在
make执行之后再执行make install,该操作则将src下的许多可执行文件复制到/usr/local/bin目录下,这样做可以在任意目录执行redis的软件的命令(例如启动,停止,客户端连接服务器等)
Linux - CentOS 7 64 位,启动 Redis
- 进入
redis的src目录。 - 启动
redis,查看是否启动成功ps -ef | grep redis- 前台启动:
./redis-serversrc目录下执行redis-server- 以前台的方式启动,不能退出当前窗口,退出窗口,应用终止。
- 后台启动:
./redis-server &
- 前台启动:
Linux - CentOS 7 64 位,关闭 Redis
- 方式一:使用 redis 客户端关闭, 向服务器发出关闭命令
src目录下,执行./redis-cli shutdown- 推荐使用这种方式,redis 先完成数据操作,然后再关闭。
- 方式二:kill pid 或者 kill -9 pid
- 这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
- 先使用
ps -ef | grep redis查出进程号, 在使用kill pid
Linux - CentOS 7 64 位,连接 Redis
redis 命令行客户端
- 方式一:直接连接 redis (默认ip127.0.0.1,端口6379):
./redis-clisrc目录, 执行./redis-cli
- 方式二:指定 IP 和端口连接 redis:
./redis-cli -h 127.0.0.1 -p 6379- -h redis 主机 IP(可以指定任意的 redis 服务器)
- -p 端口号(不同的端口表示不同的 redis 应用)
src目录执行
redis 远程客户端
- Redis Desktop Manager:C++ 编写,响应迅速,性能好。
- Another Redis Desktop Manager
注意事项 :使用远程连接 redis 时,需要修改 redis.conf 配置文件:
- 备份一份配置文件:
cp redis.conf bak_redis.conf - bind ip 这一行注释掉
- protected-mode yes 保护模式改为 no
- 使用修改后的配置文件后台启动 redis(src 目录下):
./redis-server ../redis.conf &
Redis 基本操作命令
沟通命令,查看状态
redis> ping [message]
作用:输入 ping,redis 返回 pong,表示 redis 服务运行正常。
返回:不加 message 为 PONG,加 message 为 message。
查看当前数据库中 key 的数量
redis> dbsize
作用:返回当前书库中的 key 的数量。
返回:数字,key 的数量。
redis 默认使用 16 个库
在 redis 配置文件中可以进行修改。
切换数据库命令
redis> select index
作用:切换到指定的数据库。
返回:OK
删除当前数据库中的所有数据
redis> flushdb
作用:清空当前数据库中的所有数据
返回:OK
redis 自带的客户端退出当前 redis 连接
redis> exit
redis> quit
作用:退出当前 redis 连接
Redis 的 Key 的操作命令
查找符合条件的 key
keys pattern
作用:查找所有符合模式 pattern 的 key,pattern 可以使用通配符。
返回:符合条件的 key。
判断一个或多个 key 是否存在
exists key [key...]
作用:判断 key 是否存在
返回:整数,返回存在的 key 的数量。
设置 key 的生存时间
expire key seconds
作用:设置 key 的生存时间,超过时间的 key 自动删除,单位是秒。
返回:设置成功返回 1,其他情况是 0。
查询 key 的剩余生存时间
ttl key
作用:time to live,返回 key 的剩余生存时间
返回:
- -1 表示没有设置 key 的生存时间,key 永不过期;
- -2 表示 key 不存在;
- 数字 表示 key 的剩余时间,单位是秒。
查看 key 所存储值的数据类型
type key
作用:查看 key 对应值的数据类型
返回:
- none 表示 key 不存在
- string 表示 字符串
- list 表示列表
- set 表示集合
- zset 表示有序集
- hash 表示哈希表
删除存在的 key
del key [key...]
作用:删除存在的 key,不存在的 key 忽略。
返回:数字,删除的 key 的数量;不存在的 key 删除时返回 0。
Redis 的 5 种数据类型与操作命令
字符串类型 string
类型介绍
字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON 化的对象甚至是一张图片。最大 512 M。

基本命令
- set
redis> set key value
作用:将字符串的值 value 设置到 key 中。
- get
redis> get key
作用:获取 key 中设置的字符串。
返回:不存在的 key 返回 (nil)
- incr
redis> incr key
作用:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行 incr 操作。
返回:增加后的最终值。
注意:只能对数字类型的数据操作
- decr
redis> decr key
作用:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。
返回:减少后的最终值。
注意:只能对数字类型的数据操作
- append
redis> append key value
作用:如果 key 存在,则将 value 追加到 key 原来旧值的末尾;如果 key 不存在,则将 key 设置值为 value。
返回:追加字符串之后的总长度。
常用命令
- strlen
redis> strlen key
作用:返回 key 所存储的字符串值的长度。
返回:如果 key 存在,返回字符串值的长度;如果 key 不存在,返回 0。
- getrange
redis> getrange key start end
作用:获取 key 中字符串值从 start 开始到 end 结束的子字符串,包括 start 和 end;负数表示从字符串的末尾开始,-1 表示最后一个字符。
返回:截取的子字符串。
例子:
redis> set username zhangsan
OK
redis> getrange username 0 -2
"zhangsa"
redis> getrange username 2 100
"angsan"
- setrange
redis> setrange key offset value
作用:用 value 覆盖(替换)key 对应存储的值,起始位置从 offset 开始,不存在的 key 如果 offset > 0,则起始位置前的内容用空字符串填补。
返回:修改后的字符串的长度。
例子:不存在的 key
redis> setrange password 2 shenjingbing
(integer) 14
redis> get password
"\x00\x00shenjingbing"
- mset
redis> mset key value [key value...]
作用:同时设置一个或多个 kay-value 键值对。
返回:OK
- mget
redis>mget key [key...]
作用:获取所有给定 key 的值。
返回:包含所有 key 的列表。
哈希类型 hash
类型介绍
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

基本命令
- hset
redis> hset key field value
作用:将 key 对应的 hash 表中的 field 设置为 value,如果 key 不存在,则新建 hash 表,执行 field、value 的赋值,如果有 field,则覆盖 value。
返回:
- 如果 field 是 hash 表中的新 field,且设置值成功,返回 1。
- 如果 field 已经存在,旧值覆盖新值,返回 0。
- hget
redis> hget key field
作用:获取 hash 表 key 中给定 field 的值。
返回:field 对应的 value 值,如果 key 不存在或者 field 不存在返回 nil。
- hmset
redis> hmset key field [field...]
作用:将 key 对应的 hash 表中的一个或多个 field 设置为 value,如果 key 不存在,则新建 hash 表,执行 field、value 的赋值,如果有 field,则覆盖 value。
返回:设置成功返回 ok , 如果失败返回一个错误
- hmget
redis> hmget key field [field...]
作用:获取 hash 表 key 中一个或多个 field 的值。
返回:返回和 field 顺序对应的值,如果 field 不存在,返回 nil。
- hgetall
redis> hgetall key
作用:获取 hash 表 key 中所有的 field 和 value。
返回:以列表形式返回 hash 中 field 和 value,key 不存在,返回空 hash(empty list or set)。
- hdel
redis> hdel key field [field...]
作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略。
返回:成功删除的 field 的数量。
常用命令
- hkeys
redis> hkeys key
作用:获取指定 key 中的所有 field。
返回:如果 key 存在则返回对应的所有 field,如果 key 不存在则返回(empty list or set)。
- hvals
redis> hvals key
作用:返回 hash 表中所有 field 的值。
返回:包含 hash 表所有 field 的 value 的列表,key 不存在返回空列表(empty list or set)。
- hexists
redis> hexists key field
作用:查看 hash 表 key 中,给定域 field 是否存在。
返回:如果 field 存在,返回 1, 其他(key 或者 field 不存在)返回 0。
列表类型 list
类型介绍
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

基本命令
- lpush
redis> lpush key value [value...]
作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头,可以添加重复值。
返回:数字,新列表的长度

- rpush
redis> rpush key value [value...]
作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右的顺序依次插入到表尾,可以添加重复值。
返回:数字,新列表的长度
- lrange
redis> lrange key start stop
作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第二个元素;start , stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 start,stop 超出列表的范围不会出现错误。
返回:指定区间的列表。
- lindex
redis> lindex key index
作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。
返回:指定下标的元素;index 不在列表范围,返回 nil。
- llen
redis> llen key
作用:获取列表 key 的长度。
返回:数值,列表的长度;key 不存在返回 0。
常用命令
- lrem
redis> lrem key count value
作用:count 表示移除元素 value 的个数,count > 0 表示从列表的 左侧 向右开始移除;count < 0 表示从列表的尾部开始移除;count = 0 表示移除表中所有与 value 相等的值。
返回:数值,移除的元素个数。
- lset
redis> lset key index value
作用:将 key 对应的 list 中的 index 处的元素替换为 value。
返回:成功返回 OK,key 不存在返回(error ERR no such key),index 越界返回(error ERR index out of range)
- linsert
redis> linsert key before|after pivot value
作用:将 value 插入列表 key 当中值 pivot 之前还是之后,key 不存在或者 pivot 不存在,不执行任何操作。
返回:成功返回新列表的总长度,pivot 不存在返回 -1,key 不存在返回 0。
- lpop
redis> lpop key
作用:从最左侧删除一个 value。
返回:被删除的 value 值,没有值了返回 nil。
- rpop
redis> rpop key
作用:从最右侧删除一个 value。
返回:被删除的 value 值,没有值了返回 nil。
集合类型 set
类型介绍
Redis 的 Set 是 string 类型的 无序 集合,集合成员是唯一的,即集合中不能出现重复的数据。

基本命令
- sadd
redis> sadd key member [member...]
作用:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。
返回:加入到集合的新元素的个数,不包括被忽略的元素。
- smembers
redis> smembers key
作用:获取集合 key 中的所有成员元素,不存在的 key 视为空集合。
返回:所有成员元素。
- sismember
redis> sismember key member
作用:判断 member 元素是否是集合 key 的成员。
返回:member 是集合成员返回 1,其他返回 0。
- scard
redis> scard key
作用:获取集合里面的元素个数。
返回:数字,key的元素个数。 其他情况返回 0。
- srem
redis> srem key member [member...]
作用:删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。
返回:数字,成功删除的元素个数,不包括被忽略的元素。
常用命令
- srandmember
redis> srandmember key [count]
作用:只提供 key,随机返回集合中一个元素,元素不删除,依然在集合中;提供了 count 时,count 正数, 返回包含 count 个数元素的集合, 集合元素各不相同。count 是负数,返回一个 count 绝对值的长度的集合, 集合中元素可能会重复多次。
返回:一个元素;多个元素的集合。
- spop
redis> spop key [count]
作用:随机从集合中删除一个元素, count 是删除的元素个数。
返回:被删除的元素,key 不存在或空集合返回(empty list or set)。
有序集合类型 zset sorted set
类型介绍
Redis 有序集合 zset 和集合 set 一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。

基本命令
- zadd
redis> zadd key score member [score member...]
作用:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果 member 存在集合中,则更新值;score 可以是整数或浮点数。
返回:数字,新添加的元素个数。
- zrange
redis> zrange key start stop [withscores]
作用:查询有序集合,指定区间的内的元素。集合成员按 score 值从小到大来排序。start, stop 都是从 0 开始。0 是第一个元素,1 是第二个元素,依次类推。以 -1 表示最后一个成员,-2 表示倒数第二个成员。WITHSCORES 选项让 score 和 value 一同返回。
返回:自定区间的成员集合。
- zrevrange
redis> zrevrange key start stop [withscores]
作用:返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。其它同zrange 命令。
返回:自定区间的成员集合。
- zrem
redis> zrem key member [member...]
作用:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略。
返回:被成功删除的成员数量,不包括被忽略的成员。
- zcard
redis> zcard key
作用:获取有序集 key 的元素成员的个数。
返回:key 存在返回集合元素的个数,key 不存在,返回 0。
常用命令
- zrangebyscore
redis> zrangebyscore key min max [withscores] [limit offset count]
作用:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成员,有序成员是按递增(从小到大)排序。min,max是包括在内,使用符号 ( 表示不包括。min,max 可以使用 -inf,+inf 表示最小和最大 limit 用来限制返回结果的数量和区间。withscores 显示 score 和 value。
返回:指定区间的集合数据。
- zrevrangebyscore
redis> zrevrangescore key min max [withscores] [limit offset count]
作用:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min)的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。其他同 zrangebyscore。
返回:指定区间的集合数据。
- zcount
redis> zcount key min max
作用:返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max)的成员的数量。使用 ( 可以不包含 min 或 max,也可以使用 -inf,+inf 表示最小值和最大值。
返回:元素的个数。
Redis 事务
事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
Redis 中的事务(transaction)是一组命令的集合,至少是 两个或两个以上 的命令,redis 事务保证这些命令被执行时中间不会被任何其他操作打断。
事务操作的命令
- multi
redis> multi
作用:标记一个事务的开始,事务内的多条命令会按照先后顺序被放进一个队列当中。
返回:总是返回 OK
- exec
redis> exec
作用:执行所有事务块内的命令。
返回:事务内的所有执行语句内容,事务被打断(影响)返回 nil。
- discard
redis> discard
作用:取消事务,放弃执行事务块内的所有命令。
返回:总是返回 OK
- watch
redis> watch key [key...]
作用:监视一个或多个 key,如果在事务执行之前这个或这些 key 被其他命令所改动,那么事务将被打断。
返回:总是返回 OK
- unwatch
redis> unwatch
作用:取消 watch 命令对所有 key 的监视,如果在执行 watch 命令之后,exec 命令或 discard 命令先被执行,那么就不需要再执行 unwatch 了。
返回:总是返回 OK
实现事务
事务正常执行
执行步骤:
- 开启事务
- 向事务队列中加入命令
- 执行事务提交

事务执行exec之前,入队命令错误(语法错误;严重错误导致服务器不能正常工作(例如内存不足)),放弃事务。
结论:事务执行exec之前,入队命令错误,事务终止,取消,不执行。

事务执行exec命令后,执行队列命令,命令执行错误,事务提交
结论:在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。Redis 在事务失败时不进行回滚,而是继续执行余下的命令。
Redis这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误。就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
Redis 的事务对除语法错误之外的错误概不负责!!!

放弃事务

Redis 的 watch 机制
watch 机制原理:
-
使用 watch 监视一个或多个 key,跟踪 key 的 value 修改情况,如果有 key 的 value 值在事务 exec 执行之前被修改了,整个事务被取消。exec 返回提示信息,表示事务已经失败。
-
watch 机制使得事务 exec 变得有条件,