zoukankan      html  css  js  c++  java
  • 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主从

    Redis主从其实是为了数据备份(不同于MySQL  MySQL主从有读写分离的功能)。

    当数据做出任何处理操作的时候都进行即时的备份,这种设计在Redis里面叫做主从设计 从服务器只是做数据备份 除此之外 什么都不做。常用 一主二从制。

    配置(大致说明):

    1)主服务器配置不需要做出任何变化,我不关心你有多少从服务器

    2)编辑redis-->conf下面 redis.conf配置文件  salveof masterip masterport 

    3)在从服务器上设置 masterauth "主服务器的密码"

    4) ./redis-server redis.conf 启动Redsi

    Redis做缓存避免脏数据

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

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

    rm_redis
    update_db
    sleep xxx ms
    rm_redis
    当然这种策略要考虑redis和数据库主从同步的耗时,所以在第二次删除前最好休眠一定时间,比如500毫秒,这样毫无疑问又增加了写请求的耗时
  • 相关阅读:
    461. Hamming Distance
    342. Power of Four
    326. Power of Three
    368. Largest Divisible Subset java solutions
    95. Unique Binary Search Trees II java solutions
    303. Range Sum Query
    160. Intersection of Two Linked Lists java solutions
    88. Merge Sorted Array java solutions
    67. Add Binary java solutions
    14. Longest Common Prefix java solutions
  • 原文地址:https://www.cnblogs.com/ssskkk/p/9901974.html
Copyright © 2011-2022 走看看