String类型
在Redis中value可以为整数、浮点数、字符串,如果设置的为整数、字符串,Redis会自动转为整数和浮点数,
可以执行自增自减操作,如果对一个字符串执行自增自减,那么会返回异常。
-
set命令
做数据缓存,比如耗死是数据查询,可以通过sql进行哈希后的值作为key,值作为value。缓解数据库压力。 -
setnx
不存在则设置值,返回1,存在则直接返回0,作为分布式锁的核心命令。 -
getset
返回之前的值,将key设置为新的值。
value最大存储的数据为512MB。
背后的数据结构
如图中,如果一个值比较小,即为embstr,如果比较大,大于39(redis4为40个字节),那么为raw,如果能确定为数值型,那么即为integer。
Hash
Redis中的hash数据结构,类似于一个map结构,可以存储结构化的数据,入用户信息,key为用户id,fiedl为userName,
value为名字。非常适合存储相关联的数据在一起。
- hgetall
获 取 k e y 中 所 有 的 f i e l d 和 v a l u e , 需 要 注 意 的 是 r e d i s 是 单 线 程 模 型 , 如 果 一 个 k e y 中 存 储 着 很 多 个 f i e l d 和 v a l u e , \color{#FF0000}{ 获取key中所有的field和value,需要注意的是redis是单线程模型,如果一个key中存储着很多个field和value,} 获取key中所有的field和value,需要注意的是redis是单线程模型,如果一个key中存储着很多个field和value,
那 么 执 行 的 时 候 会 很 耗 时 , 可 以 采 用 h k e y s 命 令 获 取 所 有 的 f i e l d , 然 后 分 批 去 取 v a l u e 。 或 者 用 h s c a n \color{#FF0000}{那么执行的时候会很耗时,可以采用hkeys命令获取所有的field,然后分批去取value。或者用hscan} 那么执行的时候会很耗时,可以采用hkeys命令获取所有的field,然后分批去取value。或者用hscan
hscan使用如下
Set<String> fileds = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> fields = new HashSet<>();
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
ScanParams scanParams = new ScanParams();
scanParams.count(1000);
ScanResult<Map.Entry<String, String>> scan = commands.hscan(hashKey, "0", scanParams);
int count = 0;
while (scan.getStringCursor() != null) {
count++;
for (Map.Entry<String, String> entry : scan.getResult()) {
fields.add(entry.getKey());
}
if (Objects.equals("0", scan.getStringCursor())) {
//扫描完成
break;
} else {
//继续下一次扫描
scan = commands.hscan(hashKey, scan.getStringCursor(), scanParams);
}
}
System.out.println(count);
return fields;
});
System.out.println(fileds.size());
案例,存储热用户数据,
方案一:采用key为用户id,value为序列化的用户pojo。序列化需要耗时,所有属性为一个整体,修改较为麻烦。
方案二:采用hash,key为用户id,field为属性名,value为属性值。各个属性为单独的个体,修改较为方便,