作者:前年老妖 | 来源:互联网 | 2023-08-11 07:16
1.为什么要使用lua脚本,使用lua脚本操作redis有哪些好处1.我现在模拟一个场景获取一个用户的购物车里面所有商品的详情。1.1用户购物车的redis数据结构MapitemI
1.为什么要使用lua脚本,使用lua脚本操作redis有哪些好处
- 1.我现在模拟一个场景获取一个用户的购物车里面所有商品的详情。
Map itemInfo = new HashMap();
itemInfo.put("name","刮胡刀");
itemInfo.put("type","电动");
itemInfo.put("price","200.00");
....穿件10件商品
Jedis jedis = CacheUtils.getJedis();
try{
jedis.sadd("car." + userId,"item.info." +Item);
jedis.sadd("car." + userId,"item.info." +Item2);
jedis.hmset("item.info." +Item ,itemInfo);
jedis.hmset("item.info." +Item2 ,itemInfo2);
.......插入10件商品
}finally{
CacheUtils.returnJedis(jedis);
}
Jedis jedis = CacheUtils.getJedis();
try{
Set infos = jedis.smembers("car."+userId);
for (String info : infos){
Map itemInfo = jedis.hgetAll(info);
}
}finally{
CacheUtils.returnJedis(jedis);
}
以上代码实现了获取某个用户购物车的所有商品。
StringBuffer lua = new StringBuffer();
lua.append(" local infos = redis.call('SMEMBERS','car.'..KEYS[1]); ")
.append("local datas = {}; ")
.append("for i,info in ipairs(config_ids) do ")
.append(" local info = redis.call('HGETALL',info); ")
.append(" table.insert(datas,info); ")
.append("end; ")
.append("return datas ");
Jedis jedis = CacheUtils.getJedis();
String scriptLoad = jedis.scriptLoad(lua.toString());
try {
List list = (List)jedis.evalsha(scriptLoad,1,userId);
} finally {
CacheUtils.returnJedis(jedis);
}
- 1.3.1 使用lua能减少网络的开销,假设原先10次请求和10次响应,使用lua将减少至1次请求1次响应,并且lua会被缓存到redis中再次执行这个方法的时候,直接在redis中获取缓存的脚本直接执行,进一步的减少网络的开销。
- 1.3.2 减少线程持有jedis对象的时间,更快的把redis对象释放掉。
- 1.3.3 lua能保证整一个代码块的原子性,通过lua可以实现一些简单的分布式锁的功能。
2.使用lua的注意事项
- 1 使用lua操作redis的时候需要注意【不能执行太复杂的逻辑】一旦lua脚本执行了太复杂的逻辑势必会占用了redis的整个资源,使得其他的线程只能阻塞,严重会影响整个系统的吞吐量。