redis基本操作


redis是一个开源的,内存中的数据结构存储系统,可以用作数据库,缓存,中间件MQ

linux连接redis
通过ls及cd 找到redis所在文件夹
redis -server kconfig/redis.conf 开启redis

redis -cli -p 6379 完成连接
ping 来判断是否连接成功

ps -ef|grep redis 查看服务器和客户端是否运行成功

set key value 设置key的值为value
get key 获取key的值
strlen key 获取key的长度
type key 获取key的类型 类型包含 字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与 范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询
key * 获取所有键
exist key 判断key是否存在 1则存在 0为不存在
move key 1 将key移动到1号数据库
expire key 60 设置key的过期时间为60s
ttl key 获取key的过期时间
flushdb 清空当前数据库的数据
flushall 清空所有数据库的数据
append key 'hello' 追加hello字符串到key中,会返回key的字符串长度, key不存在则等同set key value

set views 0 设置views为0
incr views views+1
decr views views-1
incrby views 10 views+10
decrby views 10 views-10

getrange key 0 3 获取key的0到3的值,不改变原值
getrange key 0 -1 获取全部字符串
setrange key 1(修改字符的位置) xx 替换指定位置开始的字符串

setex key 30 "hello" 设置过期时间 ,设置key的值为hello并且有效时间为30秒
setnx key "mongodb" 不存在设置,当key中不存在值时进行创建key,存在则创建失败(分布式锁中常常使用)

mset k1 v1 k2 v2 k3 v3 同时设置k1的值为v1,k2的值为v2,k3的值为v3
mget k1 k2 k3 同时获取k1,k2,k3的值
msetnx k1 v1 k2 v2 判断k1和k2有没有值,都没有则成功设置,其中一个有值则失败(原子性的操作)

mset user:1:name zhangsan user:1:age 2
user:{id}:{field} user为对象 id为user对象的id field为user的属性 用:分隔不同的层次


getset key redis 如果不存在值则返回nil并设置key为redis ,如果存在值则返回原来的值并用新值替换原来的值

lpush list one 为list列表从左边插入one字符串
lpush list two
lpush list three


lrange list 0 -1 查看list全部数据
结果: three
two
one

把list想象成一个横着放的两边通的桶,
lpush是从桶左边放入字符串,先进的被后进的推向右边,依次排列

lrange list 0 1 查询list的0到1的值
结果:
three
two
lrange是从桶的左边开始取出值,因为three是最后一个进的,所以取出来的时候是第一个
要是用rrange取值的话
结果:
one
two

lpop list 删除list最左边的值
结果:three

rpop list 删除list最右边的值
结果:one


redis事务
一组命令的集合 一个事务的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行
一次性、顺序性、排他性 执行一系列命令

--队列 set set set 执行--
redis事务没有隔离级别的概念
所有命令在事务中,并没有直接被执行,只有发起执行命令(exec)时才会执行
redis单条命令是保存原子性的,但是事务不保证原子性
redis事务:
开启事务(multi)
命令入队(....)如 set key value set key2 value2 等一系列命令
执行事务(exec)

//执行事务
multi 开启事务
set k1 v1
set k2 v2
exec 执行事务


//放弃事务
multi 开启事务
set k1 v2
set k2 v2
discard 放弃事务命令 ,这个事务的所有命令都不会被执行


编译型异常(代码有问题,命令有错误),事务中所有命令都不会被执行
multi
set k1 v1
set k2 v2
getset k2 这里报错 因为getset的正确用法为getset k2 v2 这里出现命令错误
exec

结果:事务命令全部未执行

运行时异常(类似java中的1/0),如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以被执行的
set k1 "v1"
multi
incr k1 这种在编译的时候是没问题的,只是正常的进行k1的+1,但是在运行的时候,因为k1的值是字符串类型,不能执行k1的+1操作 所以这里报错
set k2 v2
set k3 v3
get k3
exec

结果:
(error)
ok
ok
"v3"

事务中的第一个命令失败了,但是后面的命令依然执行


redis的乐观锁 watch
很乐观,认为什么时候都不会出问题,所以不会上锁,但是在更新数据的时候会判断一下是否有人修改过这个数据
获取version
更新的时候比较version

set money 100
set out 0

watch money 监视money,检查是否发生变化

事务正常执行成功:
multi
decrby money 20
incrby out 20
exec

事务执行失败:
watch money
multi
descby money 20
incrby out 20
这时有另一个线程进行了修改 set money 1000
然后回到原本的线程执行事务 exec
结果:这个事务修改失败,因为watch监视了money的值,一旦money的值出现变化,则事务失败

首先unwatch解除监视
然后重新执行watch money 用来获取money的最新值重新进行监视
再接着执行事务,要是没有其他线程对值进行修改,则正常执行事务

posted @ 2021-04-26 17:02  ~╰☆終極﹏o  阅读(59)  评论(0)    收藏  举报