当前位置: 首页 > news >正文

Redis保证事务一致性,以及常用的数据结构

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

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

Redis的工具类:JedisAdapter

View Code
除了数据结构:reids还可以用来保持事务的一致性;例如:

1:关于Redis的事务:利用reids的exec命令保证执行,不然就discard回滚
例如声明两个方法:
Transaction multi(Jedis jedis)
List<Object> exec(Transaction tx, Jedis jedis)
    public Transaction multi(Jedis jedis) {
                try {
                    return jedis.multi();
                } catch (Exception e) {
                    logger.error("发生异常" + e.getMessage());
                } finally {
                }
                return null;
            }
        
            public List<Object> exec(Transaction tx, Jedis jedis) {
                try {
                    return tx.exec(); //保证事务执行
                } catch (Exception e) {
                    logger.error("发生异常" + e.getMessage());
                    tx.discard();   //回滚
                } finally {
                    if (tx != null) {
                        try {
                            tx.close();
                        } catch (IOException ioe) {
                            // ..
                        }
                    }
                    if (jedis != null) {
                        jedis.close();
                    }
                }
                return null;
            }
View Code

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

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

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

   List:双向列表,适用于最新列表,关注列表
lpush
lpop
blpop
lindex
lrange
lrem
linsert
lset
rpush
Set:适用于无顺序的集合,点赞点踩,抽奖,已读,共同好友

sdiff
smembers
sinter
scard
SortedSet:排行榜,优先队列

zadd
zscore
zrange
zcount
zrank
zrevrank
Hash:对象属性,不定长属性数

hset
hget
hgetAll
hexists
hkeys
hvals
KV:单一数值,验证码,PV,缓存
set
setex
incr
Jedis jedis = new Jedis("redis://localhost:6379/9");
jedis.flushDB();

// get set
jedis.set("hello", "world");
print(1, jedis.get("hello"));
jedis.rename("hello", "newhello");
print(1, jedis.get("newhello"));
jedis.setex("hello2", 1800, "world");

//
jedis.set("pv", "100");
jedis.incr("pv");
jedis.incrBy("pv", 5);//一次加五
print(2, jedis.get("pv"));
jedis.decrBy("pv", 2);
print(2, jedis.get("pv"));

print(3, jedis.keys("*"));//打印出来所有的key


//
String listName = "list";
jedis.del(listName);
for (int i = 0; i < 10; ++i) {
    jedis.lpush(listName, "a" + String.valueOf(i));
}
print(4, jedis.lrange(listName, 0, 12));
print(4, jedis.lrange(listName, 0, 3));
print(5, jedis.llen(listName));//长度
print(6, jedis.lpop(listName));//先进后出,pop
print(7, jedis.llen(listName));//长度
print(8, jedis.lrange(listName, 2, 6));
print(9, jedis.lindex(listName, 3));
print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.AFTER, "a4", "xx"));//插入
print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.BEFORE, "a4", "bb"));//删除
print(11, jedis.lrange(listName, 0 ,12)) ;

// hash
String userKey = "userxx";
jedis.hset(userKey, "name", "jim");
jedis.hset(userKey, "age", "12");
jedis.hset(userKey, "phone", "18618181818");
print(12, jedis.hget(userKey, "name"));
print(13, jedis.hgetAll(userKey));
jedis.hdel(userKey, "phone");
print(14, jedis.hgetAll(userKey));
print(15, jedis.hexists(userKey, "email"));
print(16, jedis.hexists(userKey, "age"));
print(17, jedis.hkeys(userKey));
print(18, jedis.hvals(userKey));
jedis.hsetnx(userKey, "school", "zju");
jedis.hsetnx(userKey, "name", "yxy");
print(19, jedis.hgetAll(userKey));

// set集和
String likeKey1 = "commentLike1";
String likeKey2 = "commentLike2";
for (int i = 0; i < 10; ++i) {
    jedis.sadd(likeKey1, String.valueOf(i));
    jedis.sadd(likeKey2, String.valueOf(i*i));
}
print(20, jedis.smembers(likeKey1)); //smembers(key)取值
print(21, jedis.smembers(likeKey2));
print(22, jedis.sunion(likeKey1, likeKey2));//求并集
print(23, jedis.sdiff(likeKey1, likeKey2)); //补集
print(24, jedis.sinter(likeKey1, likeKey2));//交集
print(25, jedis.sismember(likeKey1, "12"));//判断是否存在
print(26, jedis.sismember(likeKey2, "16"));//判断
jedis.srem(likeKey1, "5");
print(27, jedis.smembers(likeKey1));
jedis.smove(likeKey2, likeKey1, "25"); //从一移进2一个25
print(28, jedis.smembers(likeKey1));
print(29, jedis.scard(likeKey1)); //求总和

String rankKey = "rankKey";//优先队列zset()
jedis.zadd(rankKey, 15, "jim");
jedis.zadd(rankKey, 60, "Ben");
jedis.zadd(rankKey, 90, "Lee");
jedis.zadd(rankKey, 75, "Lucy");
jedis.zadd(rankKey, 80, "Mei");
print(30, jedis.zcard(rankKey));// zcard()输出
print(31, jedis.zcount(rankKey, 61, 100));
print(32, jedis.zscore(rankKey, "Lucy"));
jedis.zincrby(rankKey, 2, "Lucy");
print(33, jedis.zscore(rankKey, "Lucy"));
jedis.zincrby(rankKey, 2, "Luc");
print(34, jedis.zscore(rankKey, "Luc"));
print(35, jedis.zrange(rankKey, 0, 100));
print(36, jedis.zrange(rankKey, 0, 10));//范围输出
print(36, jedis.zrange(rankKey, 1, 3));
print(36, jedis.zrevrange(rankKey, 1, 3));//从低到高排列
for (Tuple tuple : jedis.zrangeByScoreWithScores(rankKey, "60", "100")) {
    print(37, tuple.getElement() + ":" + String.valueOf(tuple.getScore()));
}

print(38, jedis.zrank(rankKey, "Ben"));
print(39, jedis.zrevrank(rankKey, "Ben"));

String setKey = "zset";
jedis.zadd(setKey, 1, "a");
jedis.zadd(setKey, 1, "b");
jedis.zadd(setKey, 1, "c");
jedis.zadd(setKey, 1, "d");
jedis.zadd(setKey, 1, "e");

print(40, jedis.zlexcount(setKey, "-", "+"));
print(41, jedis.zlexcount(setKey, "(b", "[d"));//不包含
print(42, jedis.zlexcount(setKey, "[b", "[d"));//包含,b到d
jedis.zrem(setKey, "b");
print(43, jedis.zrange(setKey, 0, 10));
jedis.zremrangeByLex(setKey, "(c", "+");
print(44, jedis.zrange(setKey, 0 ,2));

/*连接池
JedisPool pool = new JedisPool();
for (int i = 0; i < 100; ++i) {
    Jedis j = pool.getResource();
    print(45, j.get("pv"));
    j.close();
}*/

User user = new User();
user.setName("xx");
user.setPassword("ppp");
user.setHeadUrl("a.png");
user.setSalt("salt");
user.setId(1);
print(46, JSONObject.toJSONString(user));//序列化user
jedis.set("user1", JSONObject.toJSONString(user));

String value = jedis.get("user1");
User user2 = JSON.parseObject(value, User.class);//反序列化,转化为user对象;
print(47, user2);
int k = 2;
View Code

 

转载于:https://www.cnblogs.com/liguo-wang/p/10524798.html

相关文章:

  • LNMP基础知识及简单搭建(用于个人学习与回顾)
  • Gnu/Linux 链接XServer方法
  • vue中添加favicon.ico
  • 面试篇三
  • SAP开源Java SCA工具,提供静态代码安全性测试功能
  • 最快1天搭建短视频APP!阿里云短视频解决方案上线
  • CSS3 属性
  • 《重新定义团队》读书笔记及阅读感想2600字
  • Kubernetes — 作业副本与水平扩展
  • BootStack 权限管理平台体验环境正式上线了
  • Windows Server 2016 检查更新时,错误代码8024401C 的解决方案
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 《深入理解JVM》 探究String.intern()方法
  • 大数据全解:定义、价值及挑战
  • spring项目打jar包运行,读取资源文件失败
  • 网络传输文件的问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Flex布局到底解决了什么问题
  • flutter的key在widget list的作用以及必要性
  • httpie使用详解
  • JavaScript HTML DOM
  • Javascript弹出层-初探
  • nginx 负载服务器优化
  • node 版本过低
  • Octave 入门
  • Python - 闭包Closure
  • Spring框架之我见(三)——IOC、AOP
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • ViewService——一种保证客户端与服务端同步的方法
  • 阿里云应用高可用服务公测发布
  • 多线程 start 和 run 方法到底有什么区别?
  • 服务器之间,相同帐号,实现免密钥登录
  • 汉诺塔算法
  • 好的网址,关于.net 4.0 ,vs 2010
  • 免费小说阅读小程序
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 深入 Nginx 之配置篇
  • 说说动画卡顿的解决方案
  • 跳前端坑前,先看看这个!!
  • 微信支付JSAPI,实测!终极方案
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用 Swift 编写面向协议的视图
  • 原生Ajax
  • ionic异常记录
  • python最赚钱的4个方向,你最心动的是哪个?
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # Maven错误Error executing Maven
  • #NOIP 2014#Day.2 T3 解方程
  • #微信小程序(布局、渲染层基础知识)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (笔试题)合法字符串
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转) ns2/nam与nam实现相关的文件