Redis--String和Hash

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,} keyfieldvalueredis线keyfieldvalue
    那 么 执 行 的 时 候 会 很 耗 时 , 可 以 采 用 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} hkeysfieldvaluehscan
    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为属性值。各个属性为单独的个体,修改较为方便,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值