我有一个使用Redis进行存储的Java Spring Boot应用程序。我已经进行了大量的网络搜索,但我找不到易于理解的文字,详细解释了使用/选择键参数的值与<< Redis put(键,哈希键,对象)语句中的em> hash key 参数。我正在使用Redis存储来存储特定于特定用户ID的短期会话管理对象,并且该用户ID保证是唯一的。对象值是特定类对象的JSON编码字符串:
// String format template for storing objects of this class.
public static final String STORE_MULTI_SELECT_CHOICES = "%s:store:multi_select_choices"
// Store it in Redis for access during the next interaction with the user.
// The key is the hash key prefix for the MultiSelectChoices class, followed
// by the user ID.
String key = String.format(MultiSelectChoices.STORE_MULTI_SELECT_CHOICES, userId)
// The hash key is just the user ID for now.
String hashKey = userId
// Serialize the multi-select session management object to a JSON string.
Gson gson = new Gson();
String jsonRedisValue = gson.toJson(multiSelect);
redisTemplate.opsForHash().put(key, hashKey, jsonRedisValue)
这两个参数之间有什么区别?您是否知道一个文档可以解释不同选择的性能和价值碰撞后果?另外,鉴于我的存储操作的性质,我是否需要担心Redis分片或其他专家级别的详细信息,还是我现在可以合理地忽略它们?该应用程序一旦投入生产,将面临高流量负载。
答案 0 :(得分:0)
基本上在您的场景中:
your key is: userid:store:multi_select_choices
your hashkey is: userid
and your options objects serialized into jsonRedisValue
在这种情况下,您不需要使用:
redisTemplate.opsForHash().put(key, hashKey, jsonRedisValue)
相反,您应该使用:
redisTemplate.opsForValue().put(key, jsonRedisValue)
这是一个很好的例子,可以让您理解 opsForHash 有意义的场景:
首先你要明白redis中的hash是对对象的完美表示,所以你不需要序列化对象,只需要将对象以多个键值对的形式存储,比如userid=1000,该对象具有属性:用户名/密码/年龄,您可以像这样简单地将其存储在 redis 上:
redisTemplate.opsForHash().put("userid:1000", "username", "Liu Yue")
redisTemplate.opsForHash().put("userid:1000", "password", "123456")
redisTemplate.opsForHash().put("userid:1000", "age", "32")
稍后如果您想更改密码,只需执行以下操作:
redisTemplate.opsForHash().put("userid:1000", "password", "654321")
和相应的cmd使用redis-cli:
HMSET userid:1000 username 'Liu Yue' password '123456' age 32
HGETALL userid:1000
1) "username"
2) "Liu Yue"
3) "password"
4) "123456"
5) "age"
6) "32"
HSET userid:1000 password '654321'
HGETALL userid:1000
1) "username"
2) "Liu Yue"
3) "password"
4) "654321"
5) "age"
6) "32"
我没有过多探究它是如何实现hash操作的基础的,但是我认为key和hashkey之间的区别基于文档是很明显的,key就像另一个redis key,普通字符串,hashkey是为了优化多个key-value对的存储,所以我猜后面肯定有某种hash算法来保证最优的内存存储和更快的查询和更新。
这里有详细记录:
答案 1 :(得分:-1)
你基本上是在讨论两种不同的redis操作,我不知道spring boot的具体答案,但是谈到redis,HMSET操作需要hashkey,这基本上是一个双键的键值存储而常规的SET操作是单眼的键值。 检查REDIS commands
中的操作