1. reids命令可以参考中文官网:http://redis.cn/commands.html

关于reids的使用,可以封装到工具类进行调用:

Redis的工具类:JedisAdapter

  1.  
  1. 除了数据结构:reids还可以用来保持事务的一致性;例如:
  2. 1:关于Redis的事务:利用reidsexec命令保证执行,不然就discard回滚
  1. 例如声明两个方法:
  1. Transaction multi(Jedis jedis)
  1. List<Object> exec(Transaction tx, Jedis jedis)
  1. public Transaction multi(Jedis jedis) {
  2. try {
  3. return jedis.multi();
  4. } catch (Exception e) {
  5. logger.error("发生异常" + e.getMessage());
  6. } finally {
  7. }
  8. return null;
  9. }
  10.  
  11. public List<Object> exec(Transaction tx, Jedis jedis) {
  12. try {
  13. return tx.exec(); //保证事务执行
  14. } catch (Exception e) {
  15. logger.error("发生异常" + e.getMessage());
  16. tx.discard(); //回滚
  17. } finally {
  18. if (tx != null) {
  19. try {
  20. tx.close();
  21. } catch (IOException ioe) {
  22. // ..
  23. }
  24. }
  25. if (jedis != null) {
  26. jedis.close();
  27. }
  28. }
  29. return null;
  30. }

2:对于两个方法的使用:

  1. public boolean follow(int userId, int entityType, int entityId) {
  2. String followerKey = RedisKeyUtil.getFollowerKey(entityType, entityId);
  3. String followeeKey = RedisKeyUtil.getFolloweeKey(userId, entityType);
  4. Date date = new Date();
  5. // 实体的粉丝增加当前用户
  6. Jedis jedis = jedisAdapter.getJedis();
  7. Transaction tx = jedisAdapter.multi(jedis);
  8. tx.zadd(followerKey, date.getTime(), String.valueOf(userId));
  9. // 当前用户对这类实体关注+1
  10. tx.zadd(followeeKey, date.getTime(), String.valueOf(entityId));
  11. List<Object> ret = jedisAdapter.exec(tx, jedis);
  12. return ret.size() == 2 && (Long) ret.get(0) > 0 && (Long) ret.get(1) > 0;
  13. }
  1. followee/follower两个队列
  1.  

3:常见的redis数据结构和使用:

  1. List:双向列表,适用于最新列表,关注列表
    lpush
    lpop
    blpop
    lindex
    lrange
    lrem
    linsert
    lset
    rpush
    Set:适用于无顺序的集合,点赞点踩,抽奖,已读,共同好友
  2.  
  3. sdiff
    smembers
    sinter
    scard
    SortedSet:排行榜,优先队列
  4.  
  5. zadd
    zscore
    zrange
    zcount
    zrank
    zrevrank
    Hash:对象属性,不定长属性数
  6.  
  7. hset
    hget
    hgetAll
    hexists
    hkeys
    hvals
    KV:单一数值,验证码,PV,缓存
    set
    setex
    incr
  1. Jedis jedis = new Jedis("redis://localhost:6379/9");
  2. jedis.flushDB();
  3.  
  4. // get set
  5. jedis.set("hello", "world");
  6. print(1, jedis.get("hello"));
  7. jedis.rename("hello", "newhello");
  8. print(1, jedis.get("newhello"));
  9. jedis.setex("hello2", 1800, "world");
  10.  
  11. //
  12. jedis.set("pv", "100");
  13. jedis.incr("pv");
  14. jedis.incrBy("pv", 5);//一次加五
  15. print(2, jedis.get("pv"));
  16. jedis.decrBy("pv", 2);
  17. print(2, jedis.get("pv"));
  18.  
  19. print(3, jedis.keys("*"));//打印出来所有的key
  20.  
  21. //
  22. String listName = "list";
  23. jedis.del(listName);
  24. for (int i = 0; i < 10; ++i) {
  25. jedis.lpush(listName, "a" + String.valueOf(i));
  26. }
  27. print(4, jedis.lrange(listName, 0, 12));
  28. print(4, jedis.lrange(listName, 0, 3));
  29. print(5, jedis.llen(listName));//长度
  30. print(6, jedis.lpop(listName));//先进后出,pop
  31. print(7, jedis.llen(listName));//长度
  32. print(8, jedis.lrange(listName, 2, 6));
  33. print(9, jedis.lindex(listName, 3));
  34. print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.AFTER, "a4", "xx"));//插入
  35. print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.BEFORE, "a4", "bb"));//删除
  36. print(11, jedis.lrange(listName, 0 ,12)) ;
  37.  
  38. // hash
  39. String userKey = "userxx";
  40. jedis.hset(userKey, "name", "jim");
  41. jedis.hset(userKey, "age", "12");
  42. jedis.hset(userKey, "phone", "18618181818");
  43. print(12, jedis.hget(userKey, "name"));
  44. print(13, jedis.hgetAll(userKey));
  45. jedis.hdel(userKey, "phone");
  46. print(14, jedis.hgetAll(userKey));
  47. print(15, jedis.hexists(userKey, "email"));
  48. print(16, jedis.hexists(userKey, "age"));
  49. print(17, jedis.hkeys(userKey));
  50. print(18, jedis.hvals(userKey));
  51. jedis.hsetnx(userKey, "school", "zju");
  52. jedis.hsetnx(userKey, "name", "yxy");
  53. print(19, jedis.hgetAll(userKey));
  54.  
  55. // set集和
  56. String likeKey1 = "commentLike1";
  57. String likeKey2 = "commentLike2";
  58. for (int i = 0; i < 10; ++i) {
  59. jedis.sadd(likeKey1, String.valueOf(i));
  60. jedis.sadd(likeKey2, String.valueOf(i*i));
  61. }
  62. print(20, jedis.smembers(likeKey1)); //smembers(key)取值
  63. print(21, jedis.smembers(likeKey2));
  64. print(22, jedis.sunion(likeKey1, likeKey2));//求并集
  65. print(23, jedis.sdiff(likeKey1, likeKey2)); //补集
  66. print(24, jedis.sinter(likeKey1, likeKey2));//交集
  67. print(25, jedis.sismember(likeKey1, "12"));//判断是否存在
  68. print(26, jedis.sismember(likeKey2, "16"));//判断
  69. jedis.srem(likeKey1, "5");
  70. print(27, jedis.smembers(likeKey1));
  71. jedis.smove(likeKey2, likeKey1, "25"); //从一移进2一个25
  72. print(28, jedis.smembers(likeKey1));
  73. print(29, jedis.scard(likeKey1)); //求总和
  74.  
  75. String rankKey = "rankKey";//优先队列zset()
  76. jedis.zadd(rankKey, 15, "jim");
  77. jedis.zadd(rankKey, 60, "Ben");
  78. jedis.zadd(rankKey, 90, "Lee");
  79. jedis.zadd(rankKey, 75, "Lucy");
  80. jedis.zadd(rankKey, 80, "Mei");
  81. print(30, jedis.zcard(rankKey));// zcard()输出
  82. print(31, jedis.zcount(rankKey, 61, 100));
  83. print(32, jedis.zscore(rankKey, "Lucy"));
  84. jedis.zincrby(rankKey, 2, "Lucy");
  85. print(33, jedis.zscore(rankKey, "Lucy"));
  86. jedis.zincrby(rankKey, 2, "Luc");
  87. print(34, jedis.zscore(rankKey, "Luc"));
  88. print(35, jedis.zrange(rankKey, 0, 100));
  89. print(36, jedis.zrange(rankKey, 0, 10));//范围输出
  90. print(36, jedis.zrange(rankKey, 1, 3));
  91. print(36, jedis.zrevrange(rankKey, 1, 3));//从低到高排列
  92. for (Tuple tuple : jedis.zrangeByScoreWithScores(rankKey, "60", "100")) {
  93. print(37, tuple.getElement() + ":" + String.valueOf(tuple.getScore()));
  94. }
  95.  
  96. print(38, jedis.zrank(rankKey, "Ben"));
  97. print(39, jedis.zrevrank(rankKey, "Ben"));
  98.  
  99. String setKey = "zset";
  100. jedis.zadd(setKey, 1, "a");
  101. jedis.zadd(setKey, 1, "b");
  102. jedis.zadd(setKey, 1, "c");
  103. jedis.zadd(setKey, 1, "d");
  104. jedis.zadd(setKey, 1, "e");
  105.  
  106. print(40, jedis.zlexcount(setKey, "-", "+"));
  107. print(41, jedis.zlexcount(setKey, "(b", "[d"));//不包含
  108. print(42, jedis.zlexcount(setKey, "[b", "[d"));//包含,b到d
  109. jedis.zrem(setKey, "b");
  110. print(43, jedis.zrange(setKey, 0, 10));
  111. jedis.zremrangeByLex(setKey, "(c", "+");
  112. print(44, jedis.zrange(setKey, 0 ,2));
  113.  
  114. /*连接池
  115. JedisPool pool = new JedisPool();
  116. for (int i = 0; i < 100; ++i) {
  117. Jedis j = pool.getResource();
  118. print(45, j.get("pv"));
  119. j.close();
  120. }*/
  121.  
  122. User user = new User();
  123. user.setName("xx");
  124. user.setPassword("ppp");
  125. user.setHeadUrl("a.png");
  126. user.setSalt("salt");
  127. user.setId(1);
  128. print(46, JSONObject.toJSONString(user));//序列化user
  129. jedis.set("user1", JSONObject.toJSONString(user));
  130.  
  131. String value = jedis.get("user1");
  132. User user2 = JSON.parseObject(value, User.class);//反序列化,转化为user对象;
  133. print(47, user2);
  134. int k = 2;

Redis保证事务一致性,以及常用的数据结构的更多相关文章

  1. 2020重新出发,NOSQL,Redis的事务

    Redis的基础事务和常用操作 和其他大部分的 NoSQL 不同,Redis 是存在事务的,尽管它没有数据库那么强大,但是它还是很有用的,尤其是在那些需要高并发的网站当中. 使用 Redis 读/写数 ...

  2. redis的事务不是原子性

    Reference: https://blog.csdn.net/u011692780/article/details/81213010 一.事务的四大特性 关系型数据库的事务具有四个特性: 1. 原 ...

  3. Redis的事务不是原子性的

    1.事务的四大特性 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节. ...

  4. Redis的事务

    Redis对事务的支持是部分支持,不想oracle,要么都成功要么都失败,Redis可以部分成功部分失败 1 是什么: 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺 ...

  5. Redis笔记(五)Redis的事务

    >>关系型数据库的事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. Atomic(原子性): 一个事务(transaction)中的 ...

  6. redis之事务

    一.是什么 可以一次执行多个命令,本质是一组命令集合.一个事务中的所有命令都会序列化,按顺序的串行化执行而不被其他命令插入,不许加塞.一个队列中,一次性.顺序性.排他性的执行一系列命令. 二.事务常用 ...

  7. 8、redis之事务1-redis命令

    一.概述:      和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有 ...

  8. Redis学习八:Redis的事务

    一.是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 二.能干嘛 一个队列中,一次性.顺序性.排他性的执行一系列命 ...

  9. redis(4)事务

    一.事务 一般来说,事务必须满足4个条件,也就是我们常说的ACID: 1)Atomicity 原子性:一个事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间的某个环节.事务在执行过程中发生错 ...

随机推荐

  1. [Swift]LeetCode865. 具有所有最深结点的最小子树 | Smallest Subtree with all the Deepest Nodes

    Given a binary tree rooted at root, the depth of each node is the shortest distance to the root. A n ...

  2. [Swift]LeetCode927. 三等分 | Three Equal Parts

    Given an array A of 0s and 1s, divide the array into 3 non-empty parts such that all of these parts ...

  3. 互联网最新kafka技术面试题含答案

    1.Kafka 的设计时什么样的呢? Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消费消息的程序成 ...

  4. Android device debug (adb) by Charge Only mode

    Android device debug by Charge Only mode Method 1 Connect devices to computer and execute lsusb Find ...

  5. 基于IPV6的数据包分析(更新拓扑加入了linux主机和抓取133icmp包)(第十三组)

    1.拓扑图 2.配置ipv6地址,在拓扑图上对应位置标有对应网段,所在网段的端口按照网段配置,下图以r4为例 3.配置路由表,由于静态路由还要敲ip很麻烦所以使用ospf协议,下图为ospf配置以r5 ...

  6. 轮询、长轮询与Web Socket的前端实现

    Web Socket 应用场景:实现即时通讯:如股票交易行情分析.聊天室.在线游戏等,替代轮询和长轮询 轮询 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由 ...

  7. jni c++

        java与c/c++之间的数据交互     JNI     上述两篇文章对jni的讲解比较详细,各有利弊,就文章1来说,开门见山,直接阐述了java和C/C++的交互方式:文章2是一篇百度文库 ...

  8. javascript深入理解js闭包(转载)

    此篇文章来源于http://www.jb51.net/article/24101.htm 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全 ...

  9. 一文看懂https如何保证数据传输的安全性的

    通过漫画的形式由浅入深带你读懂htts是如何保证一台主机把数据安全发给另一台主机的 对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端.之后服务器给客户端发送真实数 ...

  10. 精读《Scheduling in React》

    1. 引言 这次介绍的文章是 scheduling-in-react,简单来说就是 React 的调度系统,为了得到更顺滑的用户体验. 毕竟前端做到最后,都是体验优化,前端带给用户的价值核心就在于此. ...