《Redis深度历险:核心原理和应用实践》学习笔记一
1.redis五种数据结构
1.1 String字符串类型,对应java字符串类型
用户信息序列化后,可以用string类型存入redis中
批量读写string类型,见效网络消耗
数字类型的string类型,可以自增自减操作,有一个大小限制。
1.2 list类型,对应java的LinkedList,链表结构。
增删O(1),查询O(n)
异步队列,一边线程塞入,一边线程取出消费。
结构又和java的不同,多个ziplist组合成quicklist
1.3hash字典类型,对应java的HashMap,是数组+链表结构。
扩容:java是一次性rehash,redis渐进rehash,redis新旧结构两个一起存,然后定时任务慢慢移动,保证了高性能。
可以存储用户单个对象,好处是可以获得单个字段,坏处比起String类型架构占用更多的空间。
1.4set(集合)对应java中的HashSet,无序不重复。
可以做抽奖,去重保证一个人不会中奖两次。
1.5zset(有序集合)
存粉丝:value用户id,socre关注时间。
学生成绩:value学生成绩,socre学生分数
数据结构跳跃列表结构,分等级结构,这样快速的定位插入。
2.应用一:分布式锁
获得锁
setnx key value
存活时间
expire key time
中间异常没有释放锁,加一个存活过期时间解决。
不是原子操作?redis2.8用一条命令操作,后面学习。
超时问题,后面学习。
可冲入锁,后面学习。
3.应用二:延迟队列
异步消息队列,不能保证消息可靠性极致的追求。
list(列表)作为异步消息队列的使用,rpush/lpush入队列,lpop/rpop出队列。
队列空了怎么办?一直获取对cpu有压力,java休眠1s,会有延迟,多个消费者可以降低延迟。
上面问题可以用 blpop/brpop解决,b表示blocking,也就是阻塞读,没有数据就会自动休眠,完美解决上面的问题。注意:长时间没有数据,服务器会断开空闲连接,java编写客户端消费者注意捕获异常进行重试。
锁冲突处理?当前无法获得锁
抛出异常,通知用户稍后重试,调到对话框让用户点击重试,进行重试控制。
sleep 一会再重试。会阻塞当前的消息处理线程,导致队列的后续消息处理出现延迟。
请求转入延时队列中,过一会再试,适合异步消息处理。
延时队列实现?没看懂,后面再学习。
《Redis深度历险:核心原理和应用实践》学习笔记一的更多相关文章
- Java多线程编程实战指南(核心篇)读书笔记(五)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- 《Java多线程编程实战指南(核心篇)》阅读笔记
<Java多线程编程实战指南(核心篇)>阅读笔记 */--> <Java多线程编程实战指南(核心篇)>阅读笔记 Table of Contents 1. 线程概念 1.1 ...
- 学习笔记《Java多线程编程实战指南》三
3.1串行.并发与并行 1.串行:一件事做完接着做下一件事. 2.并发:几件事情交替进行,统筹资源. 3.并行:几件事情同时进行,齐头并进,各自运行直到结束. 多线程编程的实质就是将任务处理方式由串行 ...
- 学习笔记《Java多线程编程实战指南》二
2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于 ...
- 学习笔记《Java多线程编程实战指南》一
1.1什么是多线程编程 多线程编程就是以线程为基本抽象单位的一种编程范式,和面向对象编程是可以相容的,事实上Java平台中的一个线程就是一个对象.多线程编程不是线程越多越好,就像“和尚挑水”的故事一样 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...
随机推荐
- 循环神经网络(LSTM和GRU)(1)
循环神经网络的简单实现: import tensorflow as tf x=[1,2] state=[0.0,0.0] w_cell_state=np.array([[0.1,0.2],[0.3,0 ...
- animation transition transform
animation:动画名称 花费时间 运动曲线 何时开始 播放次数 是否反方向 div{width:100px;height:100px;background:red;animation:move ...
- Idea配置注释
Idea配置注释 方法注释 点击+号 选择2 template Group 自己随便填个有意义的name(如图的mn就是我填写的) 点击你上步填写的name (我的是mn),然后点击+选择1 Live ...
- postman与soapui操作
get和post请求的区别? get请求:直接在浏览器里直接调用就可以了,不用借助工具 向服务端获取数据的 数据是放在url里面 post请求:向服务端发送数据的 数据放在body里 ...
- 历时小半年总结之JAVA
一.JavaSE 1.多线程 (1).进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. (2).为什么要用多线程? 答:提高程序效率 (3).多线 ...
- 选项卡jq
1.无定时器 $(function(){$('.banner-point li').on('click',function(){$(this).addClass('active').siblings( ...
- FFT IP核调用与仿真之FFT数学分析
对于FFT这个IP核,我其实对它真的是又爱又恨,因为它真的耗费了我太多时间,但是随着研究的深入,遇到的问题一点点给消化解决,终于不用带着问题睡觉了,哈哈,有时候真的挺佩服自己的,遇到不懂的,不了解的, ...
- NSProxy实现AOP方便为ios应用实现异常处理策略
前段时间关注过objc实现的AOP. 在GitHub找到了其中的两个库:AOP-in-Objective-C 和 AOP-for-Objective-C 第一个是基于NSProxy来实现的:第二个是基 ...
- react-navigation 实战
npm install --save react-navigation 1.测试TabNavigator.StackNavigator和DrawerNavigator (1)新建HomeScreen. ...
- Java的常用类 String
String类: 代表字符串, java程序中的所有字符串字面值(如, "abc")都是此类的实例实现 String是一个final类,代表不可变的字符序列 字符串是常量是用双引号 ...