网站托管服务提供商,有网站建wap,口碑营销策划方案,电子商务就业方向Redis的数据类型Hash使用场景
常见面试题#xff1a;redis在你们项目中是怎么用的#xff0c;除了String数据类型还使用什么数据类型#xff1f; 怎么保证缓存和数据一致性等问题…
Hash模型使用场景
知识回顾#xff1a;
redisTemplate.opsForHash() 方法是 Redis 的 …Redis的数据类型Hash使用场景
常见面试题redis在你们项目中是怎么用的除了String数据类型还使用什么数据类型 怎么保证缓存和数据一致性等问题…
Hash模型使用场景
知识回顾
redisTemplate.opsForHash() 方法是 Redis 的 Hash哈希数据结构的操作模板方法。它返回一个 HashOperations 实例可以使用该实例执行对哈希数据结构的各种操作如添加、删除、获取元素、获取全部元素等。
使用 redisTemplate.opsForHash() 方法进行哈希操作的示例如下
// 添加元素到哈希
redisTemplate.opsForHash().put(myhash, key1, value1);
redisTemplate.opsForHash().put(myhash, key2, value2);// 获取哈希中指定的元素
String value1 (String) redisTemplate.opsForHash().get(myhash, key1);// 获取哈希中所有元素
MapObject, Object allEntries redisTemplate.opsForHash().entries(myhash);// 删除哈希中指定的元素
redisTemplate.opsForHash().delete(myhash, key1);// 判断哈希中是否存在指定的元素
boolean exist redisTemplate.opsForHash().hasKey(myhash, key1);场景使用场景
1对象缓存 比如存储用户信息 一个字段对应多个属性 id:1 、name:老许 、 age:18 、 sex:0 、 hobby:java …
2、同一个用户在不同所属系统的待办个数统计
代码实现
应用场景一保存用户的信息 h:user_key_prefix account hkacount hvuser
引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency项目启动时候自动将数据库用户信息保存到redis中
package com.xx.xx.xx.config;import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;/*** author psd*/
Slf4j
Configuration
public class SysUserConfig {Autowiredprivate SysUserService sysUserService;Autowiredprivate StringRedisTemplate redisTemplate;Autowiredprivate RedisOperationUtils redisOperationUtils;PostConstructpublic void init() {// 查询所有的用户信息ListSysUserEntity userEntityList sysUserService.queryAllSysUser();ListString accountList userEntityList.stream().map(SysUserEntity::getAccount).collect(Collectors.toList());// 清除缓存中的数据 accountList.stream().forEach(account - redisTemplate.delete(redisOperationUtils.USER_KEY_PREFIX account));// 重新新增缓存中的数据userEntityList.stream().forEach(userEntity - {// 设置一个随机过期时间 4 ~ 8小时redisTemplate.opsForHash().put(redisOperationUtils.USER_KEY_PREFIX userEntity.getAccount(), userEntity.getAccount(),JSON.toJSONString(userEntity));redisTemplate.expire(redisOperationUtils.USER_KEY_PREFIX userEntity.getAccount(), 3600 redisOperationUtils.random.nextInt(4 * 3600),TimeUnit.SECONDS);});}}
配置类 Component
public class RedisOperationUtils {/*** 用户信息redis中的key*/public final String USER_KEY_PREFIX rbac:user:;public final Random random new SecureRandom();
}项目中任意获取的可以 Testpublic void test03(){Object o redisTemplate.opsForHash().get(redisOperationUtils.USER_KEY_PREFIX Lin , Lin);SysUserEntity entity JSON.parseObject((String) o, SysUserEntity.class);System.out.println(entity entity);}可能存在疑问点 1、为啥没有用String类型 同样可以满足这个是考虑到有些字段可能会改动项目在初期阶段可能某些字段会修改添加新增包括删除 总和优先考虑Hash模型利于维护不用单个字段进行修改 删除等操作
2、如果数据有修改的情况下你是怎么保证数据类型一致性 先删除redis中的数据再写数据到mysql 再删除redis中数据
优点细节有以下几处 1、设置过期时间时候没有采用 每次new Random()而是放到一个工具类里面节约内存 2、使用Random random new SecureRandom(); 是安全的 3、采用随机过期时间随机性比较好 减少redis的内存使用
应用场景二保存用户的信息 h:phoneNum hktypeStr hvcount // h:phoneNum hktypeStr hvcount // 对应唯一标识手机号: 139xxxxxxxx hk:数据来源类型 hv:个数 Overridepublic void insertTask() {redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 18900001111, xj, 10);redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 18900001111, kd, 8);redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 18900001111, yh, 6);redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 15665440000, xj, 2);redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 15665440000, kd, 3);redisTemplate.opsForHash().put(redisOperationUtils.KEY_PREFIX 15665440000, yh, 12);}再获取时候
// 获取的taskCountStr 注意是个字符串需要做类型转换封装成vo给前端用于渲染 具体业务具体分析String taskCountStr (String) redisTemplate.opsForHash().get(redisOperationUtils.KEY_PREFIX 153xxxxxxxx, taskEnum.getOwningSystemCode());喜欢我的文章的话点个阅读或者点个点赞是我编写博客的动力持续更新中