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毫秒,这样毫无疑问又增加了写请求的耗时
  • 相关阅读:
    (转)用JMX监测JVM的运行参数
    MySql
    ORACLE小工具:存储过程清空所有表或使所有触发器失效
    简单易懂,原码,补码,反码
    centos7如何关闭防火墙
    中兴大事件
    苹果降频门:旧款iPhone哪些功能受到影响
    苹果降频门
    华为P10闪存门
    N32903系列的基础知识(1)
  • 原文地址:https://www.cnblogs.com/ssskkk/p/9901974.html
Copyright © 2011-2022 走看看