Redis put()语句中使用的键和散列键参数之间有什么区别?

时间:2017-09-05 19:43:47

标签: spring-boot hash redis

我有一个使用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分片或其他专家级别的详细信息,还是我现在可以合理地忽略它们?该应用程序一旦投入生产,将面临高流量负载。

2 个答案:

答案 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算法来保证最优的内存存储和更快的查询和更新。

这里有详细记录:

https://redis.io/topics/data-types

https://redis.io/topics/data-types-intro

答案 1 :(得分:-1)

你基本上是在讨论两种不同的redis操作,我不知道spring boot的具体答案,但是谈到redis,HMSET操作需要hashkey,这基本上是一个双键的键值存储而常规的SET操作是单眼的键值。 检查REDIS commands

中的操作