说说缓存,说说Redis
无论是客户端还是服务端,缓存都是必不可少的一种提升用户体验的策略,大家在平时开发中,有意无意都会用到缓存,比如说 Android 开发的同学们,所有的图片框架,基本都有用到缓存技术,服务端那就完全不用说了。
说说通用的缓存策略,有两种,下面来点图,这个是我司内部分享的图,我盗用下
第一种方案,客户端使用的比较多,缓存和 DB(或者文件)同步更新,服务端一般都是用第二种方案,现在服务端的一些框架已经比较成熟了,像 spring 的@Cachable 注解,就搞定了很多事情,客户端的缓存相对来说简单一些,这期重点来说说服务端的缓存应用,再确定一点,我们来说说 Redis 这个有趣的东西。
为什么要用Redis举例呢,因为我认为Redis服务是缓存框架的集大成者,除了一般的内存缓存外,还可以缓存持久化,做任务队列等。我就来说说Redis的几种典型用法吧
传统的key-value存储,这个就不用说了吧,所有缓存框架必备的功能
hash功能,在传统kv之外,提供了一个类似hashmap的对应关系,一个key可以对应许多hashkey和value,比如存储商品以及购买人的数量上,key为商品id,hashkey为购买人的userID,value为购买的数量
list功能,和Java的List类似,push(key,List)这样,某个key对应一个队列,可以存储List数据,这种用法可以用来做简单的任务队列,需要加数据时就push到队列里面,然后消费者用一个1秒的定时任务,去这个队列里面取东西(这个只是简单的任务队列做法,Redis还提供了一种即时的回调,监听机制的消息队列做法,更专业点)
Set功能,和Java的Set类似,用法和上面一样,唯一不同的就是数据是不能重复的
Sorted Set,也就是zset,member/score功能,member是成员,socre是得分,这种结构通常用于排行榜,member为userID,score为得分,比如说100分,99分这样,用这种数据结构可以根据score来自动排序
最后一点就是批量操作啦,常用的有批量和管道,批量操作可以看做是对同一个数据格式的批量操作,比如设置100key,以及对应的value,一个批量动作搞定。管道的范围更大一些,可以看做是无数的操作放到一起执行,比如你要100个kv操作,100个hash操作,100个zset操作,都可以放到一个管道里面
Redis3.0之后加入了Redis Cluster的集群功能,之前的各种东西现在用起来会有点问题,脚本啊,管道啊,和单点的操作不一样,这边先列举几个我踩过的坑,希望能起到抛砖引玉的作用
1.不支持普通的管道操作,redistemplate.excutepipeline这么执行,需自己封装管道操作类,不能支持同一个管道操作,里面有多种找错。比如说又有kv,又又hash-kv
2.zset的一些操作也无法redistemplate直接使用,得自己封装
3.配置集群中的某一台和配置全部机器的效果是一样的
4.不支持任意的脚本操作,比如Java代码调用lua脚本的操作,有可能这个脚本就没法执行,需要考虑这个脚本在redis集群上能否执行
我司做了一些简单的封装,主要就是根据key算出是哪个slot,再根据slot算出在集群中的哪一台机器上,然后同一台机器上的操作放到一台管道操作上。
大家有兴趣的话可以关注我的公众号:大土豆爱开发,分享我的技术,生活
说说缓存,说说Redis的更多相关文章
- 再谈缓存和Redis
自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...
- (转)高性能网站架构之缓存篇—Redis集群搭建
看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...
- 分布式缓存技术redis学习系列
分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...
- 缓存数据库-redis数据类型和操作(list)
转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...
- spring(三、spring中的eheche缓存、redis使用)
spring(三.spring中的eheche缓存.redis使用) 本文主要介绍为什么要构建ehcache+redis两级缓存?以及在实战中如何实现?思考如何配置缓存策略更合适?这样的方案可能遗留什 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache
文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...
- 构建高性能数据库缓存之redis主从复制
一.什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致:且实现Redis的主从复制 ...
- 构建高性能数据库缓存之redis(二)
一.概述 在构建高性能数据库缓存之redis(一)这篇文档中,阐述了Redis数据库(key/value)的特点.功能以及简单的配置过程,相信阅读过这篇文档的朋友,对Redis数据库会有一点的了解,此 ...
- 谈缓存和Redis
自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...
- 缓存数据库redis
什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...
随机推荐
- 张高兴的 Windows 10 IoT 开发笔记:BMP180 气压传感器
注意:海拔高度仅供参考 GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/BMP180Demo
- 解决Ubuntu中phpmyadmin对数据上传上限2M
本文部分参考自:http://www.myhack58.com/Article/sort099/sort0102/2011/29396.htm 原文有少量错误或者过时的(相对于ubuntu15来说)内 ...
- ELK系列~NLog.Targets.Fluentd到达如何通过tcp发到fluentd
最近火的不能再火的日志框架就是ELK,其中E(Elasticsearch)表示日志存储,L(Logstash)表示日志收集,K(kibana)表示日志的UI界面,用来查询和分析,而其中的L可以使用Fl ...
- vue项目中操作PDF文件
以前从来没接触过前端要求显示PDF文件,一时之间有点懵逼,不知从哪下手啊... 无奈之下,去找度娘,方法还不少,iframe embed object这些标签就可以, 可是拿过来做个demo一试, ...
- RabbitMQ 笔记-基本概念
ConnectionFactory.Connection.Channel ConnectionFactory.Connection.Channel,这三个都是RabbitMQ对外提供的API中最基本的 ...
- MongoDB固定集合(Capped Collections)
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素! ...
- LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- EF6中使用事务的方法
默认情况当你执行SaveChanges()的时候(insert update delete)来操作数据库时,Entity Framework会把这个操作包装在一个事务里,当操作结束后,事务也结束了. ...
- Coredata中的多线程
=================== 疑问: 1.coredata是什么?结构 2.如果在简单的demo中,我们可以在主线程中使用coredata.但是如果在真正的大项目中,这样可行么? 3.假设都 ...
- javascript高性能写法
看到一篇不错的博文,如果想写出比较高性能的代码,可参看这个链接http://developer.51cto.com/art/200906/131335.htm