可以使用Python读取java写入redis 的object数据,并解析吗?

clipboard.png
redis中使用get获取,得到图片中的java hashmap 的object直接set到redis中的数据
使用python链接redis,可以get到key,但是key里面的内容无法解析,请问有同学处理过吗~

阅读 9.3k
5 个回答

-redis 本来就只支持存储一些基本类型(数值,字符...)的。java将对象存储在redis中是将对象序列化后的字节数组存入redis的,所以你用python取到的redis中的数据时,会带有特殊的前缀,表示序列化后java的类信息。java获取这些数据的时候会有反序列的操作,所以不影响。但python取到数据后是无法解析的。
-Java 存储与python共享数据时,应避免将String字符串当做对象进行序列化存储,应直接以字符串的形式存储,如果需要共享对象,对象转化为json串存储。
-另外spring的redisTemplate 进行Hash操作时,就算你存储的是String类型的数据,也会被当做String对象序列化后存储。所以 如果过要操作redis的hash结构,建议实例化一个Jedis客户端进行操作。

------有说错的地方请指点

最简单的是将Java对象转换为json,然后存在redis中,不过这样效率不高。另一种是使用protobuf之类的序列化工具序列化java对象,然后在Python中反序列化出来。

可以了
可以了
可以了
现在可以了。


import javaobj.v2 as javaobj

# decode_responses要设置为false,如果设置为True,会报错。因为那个二进制是一个虚序列化后的java对象。。。
redisconn = redis.Redis(host='127.0.0.1',port=6379,decode_responses=False)
token = 'ttttkoen'
captcha_code= redisconn.hget('hashtable',token) 
#print(captcha_code)
res = javaobj.loads(captcha_code) # loads从二进制读取
print(res.dump())
code = res.xxx.xxxbb.value   # 读取某个属性值
print(type(code))
print(code)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏