如何利用redis从数据库读出数据

如何利用redis从数据库读出数据,第1张

应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很推荐。

这样的查询,在Redis是没办法通过value进行比较得出结果的。

但是可以通过不同的数据结构类型来做到这一点,比如如下的数据定义:

users:1 {name:Jack,age:28,location:shanghai}
users:2 {name:Frank,age:30,location:beijing}
users:location:shanghai

其中users:1 users:2 分别定义了两个用户信息,通过Redis中的hash数据结构users:location:shanghai 记录了所有上海的用户id,通过集合数据结构实现。

Jedis jedis = jedisPoolgetResource();SetshanghaiIDs = jedissmembers("users:location:shanghai");//遍历该set////通过hgetall获取对应的user信息jedishgetAll("users:" + shanghaiIDs[0]);

ID索引的集合,其次对于一些复杂查询无能为力(当然也不能期望Redis实现像关系数据库那样的查询,Redis不是干这的);

但是Redis26集成了Lua脚本,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。其实,就是说可以让你用Lua这种脚本语言,对Redis中存储的key value进行 *** 作,这个意义就大了,甚至可以将你们系统所需的各种业务写成一个个lua脚本;

public static final String SCRIPT ="local resultKeys={};"+ "for k,v in ipairs(KEYS) do "+ " local tmp = rediscall('hget', v, 'age');"+ " if tmp > ARGV[1] then "+ " tableinsert(resultKeys,v);"+ " end;"+ "end;"+ "return resultKeys;";执行脚本代码Jedis jedis = jedisPoolgetResource();jedisauth(auth);Listkeys=ArraysasList(allUserKeys);Listargs = new ArrayList<>();argsadd("28");ListresultKeys = (List)jedisevalsha(funcKey, keys, args);return resultKeys;

注意:以上的代码中使用的是evalsha命令,该命令参数的不是直接Lua脚本字符串,而是提前已经加载到Redis中的函数的一个SHA索引,通过以下的代码将系统中所有需要执行的函数提前加载到Redis中,我们的系统维护一个函数哈希表,后续需要实现什么功能,就从函数表中获取对应功能的SHA索引,通过evalsha调用就行。

最简单粗暴的方法就是把ip_startip和ip_endip都转化为Sorted Sets里的Score,然后把ip_id定义为Member。
这样我们的查询就很简单了,只需要用ZRANGESCORE查询出离ip最近SCORE对应的两个ip_id即可。
然后再分析,如果这两个ip_id是相同的,那么说明这个ip在这个地址段,如果不同的话证明这个ip地址没有被任何地址段所定义,是一个未知的ip!

这样的查询,在Redis是没办法通过value进行比较得出结果的。

但是可以通过不同的数据结构类型来做到这一点,比如如下的数据定义:

users:1 {name:Jack,age:28,location:shanghai}
users:2 {name:Frank,age:30,location:beijing}
users:location:shanghai

其中users:1 users:2 分别定义了两个用户信息,通过Redis中的hash数据结构users:location:shanghai 记录了所有上海的用户id,通过集合数据结构实现。

Jedis jedis = jedisPoolgetResource();SetshanghaiIDs = jedissmembers("users:location:shanghai");//遍历该set////通过hgetall获取对应的user信息jedishgetAll("users:" + shanghaiIDs[0]);

ID索引的集合,其次对于一些复杂查询无能为力(当然也不能期望Redis实现像关系数据库那样的查询,Redis不是干这的);

但是Redis26集成了Lua脚本,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。其实,就是说可以让你用Lua这种脚本语言,对Redis中存储的key value进行 *** 作,这个意义就大了,甚至可以将你们系统所需的各种业务写成一个个lua脚本;

public static final String SCRIPT ="local resultKeys={};"+ "for k,v in ipairs(KEYS) do "+ " local tmp = rediscall('hget', v, 'age');"+ " if tmp > ARGV[1] then "+ " tableinsert(resultKeys,v);"+ " end;"+ "end;"+ "return resultKeys;";执行脚本代码Jedis jedis = jedisPoolgetResource();jedisauth(auth);Listkeys=ArraysasList(allUserKeys);Listargs = new ArrayList<>();argsadd("28");ListresultKeys = (List)jedisevalsha(funcKey, keys, args);return resultKeys;

注意:以上的代码中使用的是evalsha命令,该命令参数的不是直接Lua脚本字符串,而是提前已经加载到Redis中的函数的一个SHA索引,通过以下的代码将系统中所有需要执行的函数提前加载到Redis中,我们的系统维护一个函数哈希表,后续需要实现什么功能,就从函数表中获取对应功能的SHA索引,通过evalsha调用就行。

查看redis
key的值的具体 *** 作步骤如下:
1、百度搜索Redis
Desktop
Manager,进行下载安装。
2、打开软件,点击连接到Redis服务器。
3、打开新增服务器,输入名称,地址,密码,测试连接并保存。
4、点击保存,添加好的连接,连接正常,即可查看redis
key的值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13335679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-17
下一篇 2023-07-17

发表评论

登录后才能评论

评论列表(0条)

保存