![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis
文章平均质量分 64
HCH996
一边失去,一边在寻找~
展开
-
redis双写一致性问题
给缓存设置过期时间从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存先更新数据库,再更新(不使用)如果线程A先更新数据库,再去更新缓存, 然后线程B在线程A的两步操作都完成后再依次操作数据库和缓存,则OK 但如果线程B先到,就会读取到到脏数据。 如果在写多读原创 2021-01-05 12:12:11 · 305 阅读 · 0 评论 -
Redis
目录Redis的原理和应用Redis的数据结构Redis管道Redis的事务Redis发布,订阅Redis集群数据复制的原理Redis持久化Redis的集群模式及工作原理主从模式哨兵模式集群模式分布式缓存设计的核心问题缓存预热缓存更新缓存淘汰策略缓存雪崩缓存穿透缓存降级Redis的原理和应用Redis是一个开源的内存中的数据结存储系统,可用作数据库,缓存和消息中间件,支持多种数据结构,例如String(字符串),Hash(散..原创 2021-01-05 10:45:14 · 178 阅读 · 0 评论 -
Redis原理以及底层数据结构初探
存储海量数据结构1. 链表, B+树,数组16个数据库object encoding some_int:可以查看redis底层数据结构。为intraw string embstr(底层数据结构)redis柔性策略设计原理根据数据结构的长度来决定数据的范围。String类型sdshdr5sdshdr8sdshdr16sdshdr32sdshdr64typedef char *sds struct_attribute_((__package)) sd.原创 2020-12-24 12:50:46 · 215 阅读 · 0 评论 -
点赞功能模块-获取用户详情与点赞过的历史文章
内容一:选择的数据结构同样也是哈希!!内容二:用户的维度~存储点赞过的历史文章(其中为了减少二次加工,对Field做了小技巧的处理..)~存储的逻辑要适用于"点赞"与“取消点赞"的场景原创 2020-10-21 21:19:41 · 721 阅读 · 0 评论 -
点赞功能模块-获取点赞排行榜
内容一:要获取点赞排行榜,得设计好数据结构并存储相应得数据;SortedSet闪亮登场内容二:为了减少二次加工和取值的方便,我们直接将"文章的标题"也一并塞进去...(备注,在Value中采用某个分隔符进行拼接)PraiseService.java //缓存点赞排行榜(数据结构zset;sortedSet)~score=点赞总数;value=文章id-文章标题 //需要同时适用于点赞和取消点赞的场景 private void cacheArticlePraiseRa.原创 2020-10-21 20:27:56 · 990 阅读 · 0 评论 -
点赞功能模块-获取文章详情与点赞用户列表
内容一:文章详情直接从db拿,而点赞用户列表其实就是从哈希数据结构Hash获取即可。内容二:获取当前用户是否已经点赞过当前的文章 - 其实就是contains方法的调用而已。原创 2020-10-21 20:02:03 · 777 阅读 · 0 评论 -
点赞功能模块-缓存取消点赞
PraiseController.java //取消点赞文章 @RequestMapping(value = "cancel",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseCancel(@RequestBody @Validated PraiseDto dto, BindingResult result){原创 2020-10-21 15:26:58 · 332 阅读 · 0 评论 -
点赞功能模块-缓存点赞的相关信息(文章维度)
内容一:选择的数据结构为哈希Hash!!内容二:文章的维度~存储文章被点赞多的用户Constant中增加一个keypublic static String RedisArticlePraiseHashKey = "SpringBootRedis:Hash:Article:Praise:V2";PraiseService.java:往db中插入数据后就要再调用cachePraiseOn函数//点赞文章 @Transactional(rollbackFor = Exc...原创 2020-10-21 11:02:04 · 399 阅读 · 0 评论 -
点赞功能模块-文章点赞功能实现
PraiseController.java//点赞文章 @RequestMapping(value = "on",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseOn(@RequestBody @Validated PraiseDto dto, BindingResult result){ Str...原创 2020-10-21 10:34:40 · 4166 阅读 · 3 评论 -
点赞功能模块-获取文章列表
内容:直接查找数据库返回文章的列表即可。PraiseController.java //获取文章列表 @GetMapping("list") public BaseResponse articleList(){ BaseResponse response=new BaseResponse(StatusCode.Success); try { response.setData(praiseService.getAll())原创 2020-10-21 08:45:27 · 227 阅读 · 0 评论 -
点赞系统设计与实战-整体业务流程介绍-数据库表设计
功能模块:其实主要包含对文章的“点赞”、“取消点赞”,获取点赞排行榜、获取用户点赞过的文章、获取点赞过的文章的用户一、整体业务流程介绍点赞功能取消点赞功能获取文章详情-文章的维度获取用户点赞过的文章列表(用户的维度)上述操作尽量在缓存中进行。二、数据库表的设计1. 两大数据库表:文章记录表article、文章的点赞记录表 article_praisearticle表CREATE TABLE `article` ( `id` int(11)...原创 2020-10-20 17:55:50 · 2123 阅读 · 0 评论 -
基于Key过期失效与定时任务实现订单超时未支付自动失效
一、将订单缓存至Redis1. 创建数据表user_ordercreate table user_order( id int(11) not null auto_increment, order_no varchar(100) not null comment "订单编号", user_id int(11) not null comment "用户id", is_active smallint(4) default 1 comment "状态(1=有效;0=无效)",..原创 2020-10-20 17:12:32 · 524 阅读 · 1 评论 -
基于Key过期失效实现 ‘N分钟内请勿重复提交“ 功能
场景一:比如“抢口罩”活动,提交成功后,N天无需重复提交...场景二:比如发表评论操作,一般是提交成功后,30min后才能再次评论...功能实现保证两点1=不能重复提交(用setIfAbsent塞入缓存,如果有指定的key,设值失败,只有没有指定的key时,设值才会成功,而且是原子性的操作,适合高并发的情景,N个并发过来的请求只会有一个进入方法体内) 2=成功塞入缓存后,设定TTL,保证只能在TTL时间后才能过期失效(也就意味着TTL之后才能再次提交)Controller之中的方法原创 2020-10-20 15:58:16 · 169 阅读 · 0 评论 -
缓存数据Key设置过期自动失效
内容:其实就是Expire命令的使用setex userOrderInfo 10 :设置10s的时间ttluserOrderInfoAPI的使用KeyExpireController.java@RestController@RequestMapping("key/expire")public class KeyExpireController extends AbstractController{ @Autowired private RedisTemplate r.原创 2020-10-20 15:21:07 · 329 阅读 · 0 评论 -
哈希Hash实战之系统数据字典实时触发与层级存储
内容:典型的数据字典:"支付状态",其数据选项的取值包括:(1=未支付;2=支付成功;3=支付失败...),对应的前端筛选组件就是"下拉框"创建字典配置表s_configcreate table s_config( id int(11) not null auto_increment, type varchar(100) character set utf8mb4 not null comment "字典类型", name varchar(100) character set原创 2020-10-18 21:09:21 · 245 阅读 · 2 评论 -
哈希Hash实战之简介与常用命令介绍
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象Redis中每个hash可以存储2^32-1键值对(40多亿)内容:正如JavaSE集合体系中的Map一样,只不过它是Map中嵌套了Map!hset hsetnx hget hgetall hmset hmget hdel hlen hkeys一个大Key,一个小key命令行hmset myhash 10010 xiaoming 10011 xiaohong 10012 xi.原创 2020-10-18 19:57:35 · 766 阅读 · 0 评论 -
有序集合SortedSet实战之充值排行榜
内容:给手机充值创建数据库表phone_fareCREATE TABLE `phone_fare` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '手机号码', `fare` decimal(10,2) DEFAULT NULL COMMENT '充值金额', `is_active` tinyint(4) DEFAULT '原创 2020-10-18 17:56:39 · 344 阅读 · 0 评论 -
有序集合SortedSet实战之简介与常用命令
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序 有序集合的成员是唯一的,但分数(score)却可以是重复的 集合是通过哈希表实现的,所以添加、删除、查找的时间复杂度为O(1)。集合中最大的成员数为2^32 -1,每个集合可存储40多亿个成员。常见命令zadd sortset 1 azadd sortset 2 bzadd sortset 3c.原创 2020-10-18 16:36:06 · 514 阅读 · 0 评论 -
集合Set实战之在线考试系统获取随机 乱序的试题
内容:用户成功登录在线考试系统后,获取一套拥有N道试题的试卷!前提:我们的数据库中已经存储好了即将用于考试的试题.....要求:保证每个考生获取到的试题数量相同、试题相同,但是顺序不相同,即所谓的A、B卷传统实现:每个用户登录成功后,请求达到我们的后端接口,之后便是前往DB查询出大量的试题,然后再在代码的层次(内存)做一个随机的排序,最终返回给用户。缺陷:在高并发请求的环境下(比如同时有1000个考生登录考试),DB和内存负载压力将很大实现:基于缓存中间件Redis具有"随机","乱序"原创 2020-10-18 12:33:37 · 654 阅读 · 2 评论 -
集合Set实战之简介与常用命令介绍
正如JavaSE集合体系中的Set一样,元素唯一存储,但是是无序的Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据 Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1) 集合中最大的成员数为2^32-1,每个集合可存储40多亿个成员命令sadd setOne redis 插入元素sadd setOne mysqlsmembers setOne: 获取所有元素scard setOne: 获取集合中的元素个数原创 2020-10-18 11:15:46 · 523 阅读 · 1 评论 -
列表List实战之借助队列特性实现多线程发送邮件
可以充当 消息队列-消息通知的角色!内容二:自我实现邮件发送的功能,而且还是多线程批量发送!发送邮件服务MailDto.java//邮箱Dto@Datapublic class MailDto implements Serializable { private String subject;//主题 private String content;//内容 private String[] tos;//接收人,可以有多个接受人}Thread..原创 2020-10-18 10:42:30 · 370 阅读 · 1 评论 -
列表List实战之商家商品信息有序存储
内容一:电商系统后端管理平台一般有两个角色,一个是管理员,一个是商家,商家可以上传自己的商品...1. 创建Product表CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '商品名称', `user_id` int(11) NOT NULL COMMENT '所属用户id', `scan_原创 2020-10-17 20:44:22 · 578 阅读 · 0 评论 -
列表List实战之简介与常用命令介绍
正如JavaSE集合体系中的List一样,元素有序存储排着序!get SpringBoot:Redis:String:Key:V2LPUSH myList a b c d e fLRANGE myList 0 6:取出指定范围的元素LINDEX myList 0LINDEX myList 1BRPOP myList 1LLEN myListLPOP myList:从左边弹出元素LREM myList:从左边移除元素 @Test public void..原创 2020-10-17 19:36:09 · 704 阅读 · 0 评论 -
字符串String实战之商品对象信息缓存管理之修改与删除
stringService.java //修改 @Transactional(rollbackFor = Exception.class) public Integer update(Item item) throws Exception{ int res = itemMapper.updateByPrimaryKeySelective(item); //数据库修改成功,也同时往cache写一份。保证双写一致性 if(res >原创 2020-10-17 18:18:07 · 104 阅读 · 0 评论 -
字符串String实战之商品对象缓存管理之新增与获取详情
1. 新创建item表CREATE TABLE `item` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(255) DEFAULT NULL COMMENT '商品编号', `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品名称', `create_time` datetime DEFAULT NULL, `content` text,原创 2020-10-17 17:55:11 · 89 阅读 · 0 评论 -
字符串String实战之简介与常用命令介绍
目录get set tt1 strlen incr decr incrby decrby mget命令的使用在JUnit中进行测试get set tt1 strlen incr decr incrby decrby mget命令的使用在JUnit中进行测试@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = MainApplication.class)public class RedisTest .原创 2020-10-15 17:57:20 · 142 阅读 · 0 评论 -
整合Redis自定义注入模板操作Bean实例
本质:是对Redis的操作组件RedisTemplate和StringRedisTemplate做自定义注入配置@Configurationpublic class RedisConfig { @Autowired private RedisConnectionFactory connectionFactory; @Bean public RedisTemplate redisTemplate(){ RedisTemplate<String,原创 2020-10-15 17:31:08 · 560 阅读 · 0 评论 -
redis简介、安装与简单使用
启动方式启动方式一:Windows下只需要双击redis-server.exe即可在本地启动redis服务 启动方式二:进入Redis的解压目录,redis-server.exe redis.windows.conf启动(推荐使用) 第一种方式启动时只会读取配置文件的一些默认配置,如果动态调整了一些配置,是不会加载的。而第二种方式则可以解决这种问题。使用使用:直接双击redis-cli.exe即可进入 命令行模式下的使用状态!如何连远程服务器redis-cli.exe -h 192.16原创 2020-10-15 17:01:36 · 67 阅读 · 0 评论