redis从入门到入土

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]> 

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值