Redis使用经验之谈
应用场景
保存用户喜欢的商品信息.
类型: Hash,
key: usr:${type_id}:${version_id}:${user_id}:${warehouse_id},
field: ${sku_id},
value: jsonstr(sku对应的brand, goods, 来源渠道等信息)
- 记录用户喜欢的商品所在档期的数目.
类型: ZSet,
key: usr:${type_id}:${version_id}:${user_id}:${warehouse_id},
value: ${brand_id},
score: int(喜欢则+1, 取消喜欢则-1) - Redis同步Queue, 定期将喜欢/取消喜欢的商品同步到mysql,
类型: List,
key: usr:${type_id}:${version_id}:${user_id}:${warehouse_id},
value: jsonstr(sku对应的brand, goods, 喜欢状态)
最佳实践
1,针对商品收藏, 粒度是sku的时候, 如何更好的利用redis丰富的数据类型?
以user_id+warehouse_id作为查询条件, 存储的信息包括sku_id, good_id, brand_id, channel, time等信息,如果采用redis基础的 Key/Value 存储结构, 那么
- 方案1: user_id+warehouse作为key, value是所有喜欢的商品信息的一个集合, 这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
- 方案2: user_id+warehouse+sku作为key, value是单件sku信息的序列化信息, 第二种方法是这个用户喜欢商品有多少成员就存成多少个key-value,用user_id+warehouse+sku唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的, 并且如果要全部取出用户所有的喜欢商品数据, 只能先用keys 正则匹配, 拿到所有key的list, 再遍历去拿每个的对应value, 性能不可接受.
2,针对统计用户喜欢商品对应档期的计数,
以user_id+warehouse作为查询条件, 存储的主要是每个brand_id下用户喜欢了多少商品,如果采用基础的K/V结构的话, 无法避免的会出现上面例子产生的问题
如果采用HASH, key: user_id+warehouse_id, field: brand_id, value: int 存在的问题是: CAS并发问题, 不通过Redis加锁机制, 无法保证加减操作的原子性, 而且必须与Redis通讯两次, 第一次获取并加锁, 第二次设置新值
所以我们采用ZSET结构, Redis sorted set的可以通过提供一个优先级(score)的参数来为成员排序或计数, 并且是插入有序的, 如果需要对set中某一个brand_id的数目进行操作只需要一次redis通讯, 并且是原子性操作
3,使用pipeline, 减少调用redis通讯次数, 如果需要返回值, 则可以使用syncAndReturn方法
踩过的坑
商品收藏一开始没有采用sharding的Redis部署架构, 导致单机Redis CPU和流量很大, 后期进行扩展的做法不知道好还是不好, 写出来大家可以讨论: 新部署结构上线前将扩容的4台新Redis实例slaveof原有实例, 将原有单机数据持续引入, 新部署结构完全上线后, 将slaveof切断, 5台实例向外提供服务.
优点: 不会造成数据丢失, 扩展平滑对调用方透明
缺点: 新实例上会有垃圾数据
Redis使用经验之谈的更多相关文章
- 架构师养成记--35.redis集群搭建
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...
- PHP Warning: PHP Startup: redis: Unable to initialize module Windows版本phpredis扩展
版权声明:经验之谈,不知能否换包辣条,另,转载请注明出处.https://www.cnblogs.com/zmdComeOn/category/1295248.html [root@VM_0_2_ce ...
- 【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。
这是why技术的第38篇原创文章 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 ...
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
随机推荐
- Leetcode总结之DFS
package DFS; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; impo ...
- JavaScript世界万物诞生记
作者:manxisuo链接:https://zhuanlan.zhihu.com/p/22989691来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一. 无中生有 起 ...
- 利用NSString的Hash方法比较字符串
实际编程总会涉及到比较两个字符串的内容,一般会用 [string1 isEqualsToString:string2] 来比较两个字符串是否一致.对于字符串的isEqualsToString方法,需要 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律十二:IT人養生之道-德行
所謂的「養生」在中國古代裡所指的是針對內在精神層面修為的提升,到了近代中醫所謂的養生,則除了包含最根本的內在精神層面之外,還涵蓋了外在身體的養護.在現今各行各業的人士當中,嚴格來說都應該要有一套專屬的 ...
- Hibernate操作Blob数据
首先看数据库.数据库中新建一个BlobTable表,表中有两个字段,一个id(主键)一个picture字段是Blob类型字段.然后使用Hibernate向该数据库中写入和读取数据 在POJO类中p ...
- win10任务管理器开机老是自己打开
win10任务管理器开机老是自己打开 学习了:https://zhidao.baidu.com/question/332868722086816045.html 还没有注意过这个东西:系统失败-> ...
- java数据库连接池简单实现
package cn.lmj.utils; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import ...
- C 标准库 - <setjmp.h>
C 标准库 - <setjmp.h> 简介 setjmp.h 头文件定义了宏 setjmp().函数 longjmp() 和变量类型 jmp_buf,该变量类型会绕过正常的函数调用和返回规 ...
- Adam:大规模分布式机器学习框架
引子 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/46676515 又是好久没写博客,记得有一次看Ng大神的訪谈录,假设每周读三篇论文, ...
- Topcoder SRM625 题解
给出一个字符串求是palindrome和anagram的比率是多少. 知识点: 1 DBL_MAX 64位double的最长数大概是1.7E308,非常大非常大,比long long大上不知多少倍.故 ...