Redis
内存存储,键值存储key: value
Redis值的五种数据结构
redis的value有五种数据结构:
分别是:字符串,哈希,列表,无序集合,有序集合。
Set和ZSET中元素不能重复
API
value为string的API
-
keys *
查看当前库中共有多少个key
-
get key
查看某个key
的值 -
mget key
查看多个key的值,mget k1 k2 k3
-
del key
删除key,key中的value页删除了 -
expire key 100
,100秒后删除key(多少秒都可) -
set key1 value
每次设置一个键值 -
mset key2 value key3 value key4 value
批量设置键值
原子加减
key存储的value可以转换为数字,并对value做加减
incr key
:加一decr key
:减一incr key 数字
:value加上指定的数字decr key 数字
hashAPI
hash是可以实现购物车的,看应用
hset key field1 value field2 value
hsetnx key ...
hget key field
mhget key field1 field2
hlen key
key中元素的数量HGETALL KEY
:返回key下所有HINCRBY key field 数字
:增加
list
list可以看成是一个管子,从管子两端都能放入数据。
LPUSH key 元素
RPUSH key 元素
应用
string
- 存储对象:
key:json
- 存储session:
set cookie短令牌 用户session
- 分布式锁:
setnx lock 1
,设置成功获取锁
hash
- 存储对象
- string能实现的都能实现
- 购物车:用户id(key),商品编号(field),商品数量(value)
- 有个小缺点:过期时间只能应用在key上,不能应用到field上面
购物车:用户id:商品1 数量,商品2 数量,商品3 数量
突然觉得有点头晕,站起身感觉人都在晃动,原来是台湾花莲县地震了…
list
list可以看成是一个管子,从管子两端都能放入数据。
- 实现栈
- 实现队列
- 实现阻塞队列
事务与乐观锁
# 开启事务
multi
# 减库存
decr product_id_num
decr product_id_num
decr product_id_num
# 更新订单状态
set id_order_status created
# 提交事务
exec
并发场景下如果不用锁Java
代码这么写肯定会出现超卖的问题。事务开启之前product_id_num
的值是1000
,如果exec
执行之前另一个客户端把product_id_num
的值改了结果会怎么样?这个事务应该作废吗?会作废吗?
# 乐观锁
# watch监听这个key的值,如果值发生变化下面的事务会被作废
watch product_id_num
# 开启事务
multi
# 减库存
decr product_id_num
decr product_id_num
decr product_id_num
# 更新订单状态
set id_order_status created
# 提交事务
exec
# 结束监听
unwatch
分布式事务
# 返回1,插入成功
setnx global_tx_key 1
expire global_tx_key 20
# 返回0,插入失败
setnx global_tx_key 1
# redission锁续命······
#