Redis常用数据类型和事物以及并发

Redis数据类型

基本类型(String int):

如 set key value 、get key 等 所有命令都是按照 key value

keys * 可以将全部数据列出,其中后面的 " * " 表示数据的匹配。

setnx key value 不覆盖设置,返回0表示失败(原来这个key已经有值),返回1表示成功。

setex key time value 设置数据保存的有效时间(time 单位是秒) 

ttl key 查看当前数据的有效时间

flushdb 清空仓库数据。

基本类型适合用户进行短期的数据存储

Hash数据类型

其保存的数据结构为 "key=value"

举例:保存一个用户的用户名、真实姓名、密码,

hset user-admin username admin   hset user-admin name xiaoming   hset user-admin password 123456

取得用户名)hget user-admin username

取得真实姓名hget user-admin name

取得密码 hget user-admin password

有了Hash之后 Redis的数据类型可以和JAVA中VO匹配的上(都是key-value格式)

hash类型存在的意义不大,因为基本类型做JSON存储也可以达到hash的效果

List数据类型

List是一个链表结构,链表结构的时间复杂度是n

举例:创建一个List并设置若干个内容。lpush testList  test1 test2 test3(testList是集合的名字,后面的是集合存储的数据)

进行指定范围的链表数据输出(链表是不能通过index查询的) lrange testList 0 1 返回 test3 test2 (栈 先进后出)

lrange testList 0 -1表示输出全部的内容

可以利用List类型实现消息队列或者缓冲的功能,在实际开发之中有很多公司可能不直接使用消息队列中间件,而直接利用Redis代替

Set 数据类型

可以实现集合的比对处理,列如可以实现数据的交集,并集,插集(比如 微博中 共同关注好友,可能关注等。。。)

举例 sadd user a b c d e(向集合user追加五个元素)

列出所有元素 smembers (set集合无序)

删除某个元素 srem user a

返回两个集合的差集合 sdiff set1 set2(返回几个set1和set2的差集)

保存差集的运行结果到另一个集合 sdiffstore存储集合key 集合key1 集合key2

该类型支持集合的运算 可用在相似度检测,好友推荐等

SortedSet集合

该集合算是Set集合的扩展,该集合可以保存一个分数,这个分数的操作就可以作为数据的统计结果出现

追加有序集合数据:zadd 集合key  分数 内容

数据增长:zincrby 集合key 增长分数 内容

根据分数取得指定范围的数据 zrangebyscore 集合 开始分数 结束分数 withscores

SotedSet主要进行数据的流式分析(利用分数分析数据,比如一个商品浏览了多少次)

Redis事物处理

Redis支持事物处理,但是这种事物处理本身是存在有设计缺陷的。

打开事物:multi

取消事物:discard

提交事物:exec

支持举例: Multi ; set i =10; discard;因为取消了事物所以 i的值不会被set成10 所以Redis是支持事物的。

缺陷举例 :Multi ; set i=10; incr name; exec; 因为 name属性不是int 所以会出现报错:ERR Value is not an integer。但是 这种情况i=10;会被正确的执行 存到Redis里面。

Redis事物不完美也可以说不支持事物,因为Redis设计之初是不考虑事物的。

Redis乐观锁

大家都知道Mysql利用版本号字段实现乐观锁。

Redis乐观锁的处理比较简单 利用watch关键字监听redis的一些键即可,不需要增加处理列(也就是平时所说的版本号)

事物1 事物2
watch id; 进行该数据的监听 watch id;
Multi; Multi;
  set id 100
 set id 200; exec;
exec;返回nil,表示本次更新失败  

此时由于第二个事物更新了原始数据 id,那么就表示该原始数据上的一个标记列发生了变化(类似于Mysql的版本号),当第一个事物更新的时候,会返回nil表示本次更新失败。

Redis做缓存避免脏数据

MySQL和Redis是两个事物,不好做强一致性。

简单点:可以延时双删+过期时间保证最终一致性。

rm_redis
update_db
sleep xxx ms
rm_redis
https://blog.csdn.net/huizhi2533/article/details/107021249
前删的原因是为了在不可重复读的时候,可以读到最新Redis的数据 
posted @ 2018-11-04 23:55  palapala  阅读(653)  评论(0编辑  收藏  举报