String操作
设置值 set key value
127.0.0.1:6379> set age 12
OK
获取值 get key; 删除值 del key
127.0.0.1:6379> get name
"zhangsan"
设置过期时间
127.0.0.1:6379> expire name 12
(integer) 1
查看过期时间
127.0.0.1:6379> ttl name
(integer) 9
追加字符串 .如果当前key不存在,就相当于setkey
127.0.0.1:6379> append k1 adsfa
(integer) 7
127.0.0.1:6379> get k1
"v1adsfa"
获取所有的key; keys *
127.0.0.1:6379> keys *
1) "sex"
2) "k1"
3) "age"
127.0.0.1:6379>
127.0.0.1:6379> append k1 ",sadfjas"
(integer) 15
127.0.0.1:6379> get k1
"v1adsfa,sadfjas"
获取key的长度 strlen key
127.0.0.1:6379> strlen k1
(integer) 15
指定增量 incr key 默认自增 1; incrby key num,指定增量为num
127.0.0.1:6379> incrby num 3
(integer) 11
指定减量
127.0.0.1:6379> decrby num 5
(integer) 6
range 字符串范围操作
127.0.0.1:6379> set k1 jaskjdfklasdkl // 设置值
OK
127.0.0.1:6379> getrange k1 0 5 //截取字符串 ,其中[0,3]闭区间
"jaskjd"
127.0.0.1:6379> getrange k1 0 -1 //获取全部的字符串
"jaskjdfklasdkl"
替换操作
127.0.0.1:6379> set k2 jzhansgan
OK
127.0.0.1:6379> get k2
"jzhansgan"
127.0.0.1:6379> setrange k2 2 LL //替换指定位置开始的字符串
(integer) 9
127.0.0.1:6379> get k2
"jzLLnsgan"
setex (set with expire) 设置过期时间
setnx (set if not exist) ; setnx key value 如果当前值不存在, 则设置, 如果存在, 设置值失败.(设置成功返回1, 设置失败返回0)
127.0.0.1:6379> setex k3 40 "hello" // 设置k3的值, 40秒后过期
OK
127.0.0.1:6379> ttl k3 // 查看过期时间
(integer) 37
127.0.0.1:6379> get k3
127.0.0.1:6379> setnx k3 "redis" //如果k3不存在,则创建k3
(integer) 1
127.0.0.1:6379> get k3
"redis"
127.0.0.1:6379> setnx k3 "mysql" // 如果k3存在,则创建失败, 返回1表示true,返回0 false
(integer) 0
127.0.0.1:6379>
mset , mget设置和获取多个值, 属于原子操作, 要么一起成功, 要么一起失败
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "name"
3) "k1"
4) "k2"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379>
mset的高级用法
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 23
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "23"
127.0.0.1:6379>
getset命令: 先get,再set值.(其中key若不存在值,则返回nil, 如果存在值则获取原来的值, 并设置新的值.)
127.0.0.1:6379> getset sql redis //获取sql,没有值返回nil
(nil)
127.0.0.1:6379> get sql //获取sql为上一步设置的值,即redis
"redis"
127.0.0.1:6379> getset sql oracle //获取sql当前为redis.在设置新的值为oracle
"redis"
127.0.0.1:6379> get sql
"oracle"
127.0.0.1:6379>
List
插入元素: 从左添加lpush / 从右添加rpush / 获取lrange
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
移除元素: 从左边移除lpop key / 从右边移除rpop key
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list // 移除list的第一个元素
"three"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "four"
127.0.0.1:6379> rpop list // 移除list的最后一个元素
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>
llen获取列表的长度, index key index根据下标获取列表的指定元素
127.0.0.1:6379> llen list // 获取列表的长度
(integer) 2
127.0.0.1:6379> lindex list 1 // 根据下标获取元素
"one"
lrem 移除list中指定个数的value值
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one //移除list中的1个one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379>
ltrim 截取元素
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> ltrim list 1 2 // 通过下标截取指定的长度,当前的lsit已经被改变,只剩下截取的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
rpoplpush 移除列表的最后一个元素, 并将其移动到新的列表中
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpoplpush list list1 // 移除list中的最后一个元素, 将其移动到list1中
"1"
127.0.0.1:6379> lrange list 0 -1 // 获取list元素
1) "3"
2) "2"
127.0.0.1:6379> lrange list1 0 -1 // 查看移动目标列表list1的元素, 已成功移动
1) "1"
127.0.0.1:6379>
Set
sadd 设置值; smembers 查询值; scard 获取元素数量; srem 删除元素
127.0.0.1:6379> clear
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd name zhangsna // 设置值
(integer) 1
127.0.0.1:6379> smembers name
1) "zhangsna"
127.0.0.1:6379> sadd name sdf
(integer) 1
127.0.0.1:6379> sadd name sdsfsdf
(integer) 1
127.0.0.1:6379> smembers name //获取值
1) "sdsfsdf"
2) "sdf"
3) "zhangsna"
127.0.0.1:6379> scard name // 获取set集合中元素的个数
(integer) 3
127.0.0.1:6379>
srandmember 随机抽选元素(获取元素,原集合元素依然存在,不受影响)
127.0.0.1:6379> srandmember name
"zhangsna"
127.0.0.1:6379> srandmember name // 在name这个set集合中随机获取一个元素
"sdf"
127.0.0.1:6379> srandmember name 2 // 在name这个set集合中随机获取指定个数的元素
1) "sdsfsdf"
2) "zhangsna"
127.0.0.1:6379> srandmember name 2
1) "sdsfsdf"
2) "sdf"
127.0.0.1:6379> srandmember name 2
1) "sdf"
2) "zhangsna"
spop 随机删除set中的元素( 获取随机的元素, 同时从原来的集合中移除该元素)
127.0.0.1:6379> smembers name
1) "sdsfsdf"
2) "sdf"
3) "zhangsna"
127.0.0.1:6379> spop name // 从set中随机删除一个元素
"sdf"
127.0.0.1:6379> spop name // 从set中随机删除一个元素
"zhangsna"
127.0.0.1:6379> smembers name //查看set集合的元素
1) "sdsfsdf"
127.0.0.1:6379>
集合差集:集合差集:sdiff key1 key2; 集合交集:sinter key1 key2; 集合并集:sunion key1 key2; 集合元素移动:smove
Hash
hset 设置值; hget 获取值; hmset 设置多个k-v; hgetall 获取所有的数据; hdel 删除指定的key
127.0.0.1:6379> hset myHash age 12 // 设置一个K-V
(integer) 1
127.0.0.1:6379> hget myHash name //获取一个K-V
"zhangsan"
127.0.0.1:6379> hmset myHash age lisi age 23 // 设置多个K-V
OK
127.0.0.1:6379> hgetall myHash //获取所有的K-V
1) "name"
2) "zhangsan"
3) "age"
4) "23"
127.0.0.1:6379> hdel myHash name //删除指定的key
(integer) 0
127.0.0.1:6379> hgetall myHash
1) "age"
2) "23"
hlen 获取hash表中的k-v字段数量; hexists 判断是在某个指定的key值
127.0.0.1:6379> hlen myHash
(integer) 1
127.0.0.1:6379> hgetall myHash
1) "age"
2) "23"
127.0.0.1:6379> hexists myHash age // 判断是否存在age
(integer) 1
127.0.0.1:6379> hexists myHash name
(integer) 0
127.0.0.1:6379>
hkeys获取所有的key值, hvals 获取所有的value值
127.0.0.1:6379> hgetall myHash
1) "age"
2) "23"
3) "sex"
4) "man"
127.0.0.1:6379> hkeys myhash
(empty list or set)
127.0.0.1:6379> hkeys myHash // 获取myHash中的所有key
1) "age"
2) "sex"
127.0.0.1:6379> hvals myHash // 说去myHash中所有的value
1) "23"
2) "man"
Zset
设置值:zadd key score member [score1 member1]
删除值:zrem key member [member1]
获取全部(正序):zrange key start stop [withscores]
获取全部(倒序):zrevrange key start stop [withscores]
按条件查(正序):zrangebyscore key min max [withscore limit]
按条件查(倒序):zrevrangebyscore key max min [withscore limit]
按条件删除(索引):zremrangebyrank key start stop
按条件删除(积分):zremrangebyscore key min max
获取集合总量:zcard key | zcount key min max
存储集合交集: zinterstore destination numkeys key key1
存储集合并集:zunionstore destination numkeys key key1
获取索引(正序):zrank key member
获取索引(倒序):zrevrank key member
score值获取:zscore key member
事务
对于redis事务, 它可以一次执行多个命令,其本质是一组命令的集合。redis事务中的所有命令都会序列化,按照顺序地串行化执行而不会被其他命令插入,不许加塞。也就是说,一个队列中,一次性、顺序性、排他性的执行一系列命令。
常用命令:
MULTI
:标记一个事务块的开始
EXEC
:执行所有事务块内的命令
DISCARD
:取消事务,放弃执行事务块内的所有命令
UNWATCH
:取消 WATCH 命令对所有 key 的监控
WATCH key [key . . . ]
:监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。一旦执行了 EXEC,之前加的监控所都会被取消掉。
redis的事务特征小结:
单独的隔离操作:事务中所有的命令多会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际的执行,也就是不存在 “ 事务内的查询要看到事务里面的更新,在事务外查询不能看到 ” 这个是让人万分头痛的问题
不保证原子性:Redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
事务的三部曲:
开启:以 MULTI 开始一个事务
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
执行:由 EXEC 命令触发事务
127.0.0.1:6379[1]> multi // 开启事务
OK
127.0.0.1:6379[1]> set k1 v1
QUEUED
127.0.0.1:6379[1]> set k2 v2
QUEUED
127.0.0.1:6379[1]> get k1
QUEUED
127.0.0.1:6379[1]> set k3 v3
QUEUED
127.0.0.1:6379[1]> exec // 执行事务
1) OK
2) OK
3) "v1"
4) OK
discard
取消事务
127.0.0.1:6379[1]> multi // 开启事务
OK
127.0.0.1:6379[1]> set k1 v1
QUEUED
127.0.0.1:6379[1]> set k2 v1
QUEUED
127.0.0.1:6379[1]> discard //取消事务
OK
127.0.0.1:6379[1]> get k2 //取消事务后队列中的命令都不会被执行
(nil) // 因为取消了,所以取到的值为空,没有设置成功
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]>
对于事务中的编译型异常
,比如代码编写错误或者命令错误,(也就是说命令执行错误导致的)那么事务中的所有命令都不会被执行
.而对于运行时异常, 如果存在语法错误
(命令执行正确,但是结果错误导致的),那么对应的结果错误的地方会抛出异常,其他的命令则会正常执行
.
redis的乐观锁实现
// 例1 监视k1之后,发现值改变修改失败.
127.0.0.1:6379[1]> set k1 1 // 设置k1
OK
127.0.0.1:6379[1]> watch k1 // #监视k1 (当已经开始监控k1,则其他客户端不能修改k1的值)
OK
127.0.0.1:6379[1]> set k1 3 //设置k1, 当前k1可能是由其他客户端修改
OK
127.0.0.1:6379[1]> multi // 开启事务
OK
127.0.0.1:6379[1]> set k1 4 // 设置k1
QUEUED
127.0.0.1:6379[1]> exec // 执行事务,但k1值不会被修改为4,k1的值仍然是3,因为在事务开启之前k1的值已经变了
(nil)
127.0.0.1:6379[1]> get k1
"3"
// 可以通过取消监视, 在重新监视之后再修改值.
---------------------------------------------
// 例2 在监视k1之后值未发生改变, 修改k1值成功
127.0.0.1:6379[1]> get k1
"1"
127.0.0.1:6379[1]> watch k1
OK
127.0.0.1:6379[1]> get k1
"1"
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set k1 5
QUEUED
127.0.0.1:6379[1]> exec
1) OK
127.0.0.1:6379[1]> get k1
"5"
127.0.0.1:6379[1]>
未完待续