缓存相关学习记录Redis,Guava etc
卍,Guava Cache笔记
卍,分布式缓存
※,什么叫分布式缓存
分布式缓存由一个服务端实现管理和控制,有多个客户端节点存储数据,可以进一步提高数据的读取速率。那么我们要读取某个数据的时候,应该选择哪个节点呢?如果挨个节点找,那效率就太低了。因此需要根据一致性哈希算法确定数据的存储和读取节点。以数据D,节点总个数N为基础,通过一致性哈希算法计算出数据D对应的哈希值(相当于门牌号),根据这个哈希值就可以找到对应的节点了。一致哈希算法的好处在于节点个数发生变化(减少或增加)时无需重新计算哈希值,保证数据储存或读取时可以正确、快速地找到对应的节点。分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。分布式缓存已经在分布式领域、云计算领域得到了广泛的应用。※,分布式与集群的概念: https://blog.csdn.net/weixin_43230063/article/details/84106460
分布式和集群在通常情况下不做严格区分,正如同并发和并行一样,应用情况下很少会去考究它的区别,许多大公司面试也直接问分布式集群怎样怎样,一般都拿等同来讲了。在这里只在概念上做一下区别,使大家更合理的去理解,没有对错之分。
分布式:一个电商系统,用户模块部署在server1, 订单模块部署在server2, 促销模块部署在server3, 商品模块部署在server4,他们之间通过远程rpc实现服务调用,这就叫分布式。强调的是不同功能模块,单独部署在不同的server上,所有server加起来是一个完整的系统。
集群:更多强调的是灾备,一个电商系统,完整的部署在server1上一个,完成的部署在server2上一个,server1宕机后,server2仍然可以正常提供请求服务,这叫集群。同样对于某一功能模块,比如用户模块部署在server1上,同样部署在server2上,也叫做集群。分布式系统的每个功能模块节点,都可以用多机做成集群。
※,
卍,Redis
相关网站:
- 英文官网 https://redis.io/
- 中文官网 http://www.redis.cn/
- 所有的Redis命令:http://doc.redisfans.com/index.html
※,简介:
- Redis 是一个开源的,使用ANSI C编写,高性能的key-value的noSQL数据库。
※,Redis与分布式缓存相关概述:https://blog.csdn.net/lz1170063911/article/details/80304618
※,Redis特点
- 基于内存;Redis是将数据直接存储在内存中,只有当内存空间不足时,将部分数据持久化到磁盘上
- 可持久化数据;
- 具有丰富的数据结构类型,适应非关系型数据的存储需求;
- 支持绝大多数主流开发语言,如C、C++、Java、Python、R、JavaScript等。
- 支持集群模式,高效、稳定。
※,Redis官网只有源码包,要安装需要自己先编译生成安装包。教程点此。
※,Ubuntu20.10安装 Redis 与相关使用
1. 安装
- ·apt policy redis-tools` // 查看Ubuntu 软件仓库中的 redis_tools(redis客户端) 的版本信息。
- ·apt policy redis-server· // Redis 服务端的版本信息
- `systemctl status redis-server` //查看Redis服务端是否运行。
- 启动Redis的两种方法:
- ·systemctl start redis· 或 ·service redis start· //以服务(service)的形式启动;
- `/usr/bin/redis-server /etc/redis/redis.conf` //手动启动Redis服务, redis.conf 是Redis配置文件位置。
- `在redis-cli 客户端下,运行 info server` 可以查看Redis配置文件位置,config_file:/etc/redis/redis.conf
- 配置文件部分解释:
- ·requirepass <your-password>· 设置密码,注释此行则代表不需要密码。
- ·database 16· // Redis默认有16个数据库,寻址角标从0开始,默认连接db0;
- ·port 6379` // Redis的端口设置,默认6379;
- ·daemonize no` // Redis默认关闭后台进程模式,改为yes,Redis服务在后台启动。
- ·loglevel notice· //设置日志等级, 日志等级从详细到简略以此为:debug-->verbose-->notice-->warning
- `logfile /var/log/redis/redis-server.log` // Redis日志输出目录。
- ·dir /var/lib/redis·// 指定数据持久化的目录,注意这里配置的是目录。
- ·dbfilename dump.rdb· // 指定数据持久化的文件名。
- 默认Redis只能本机连接服务端,远程连接Redis需要修改的配置文件项:
- ·bind 127.0.0.1 ::1· // 注释掉此配置型
- ·protected-mode yes· // 将yes 改为 no
2. 使用
- `redis-cil` 运行redis客户端;
- ·auth <password>` // 如有密码,用auth 命令认证登录;
- ·select 2· // select <index> 命令选择某个数据库;
- ·info [section]` // 查看Redis相关信息。
※, Key 和 Value
1, Value
- Redis的数据结构类型,指的就是redis的值value的类型。Redis常用的数据结构类型:string、list、set、sortedSet、hash。
2, Key
- `exists <key> [key...]` // 检查给定 key 是否存在,注意不支持通配符。多个key用空格隔开,有一个存在即返回1,都不存在返回0;
- ·del <key> [key...]` // 删除给定key,不支持通配符。多个key用空格隔开。成功删除一个即返回1,一个都没删除返回0;
- ·keys <pattern>· // 查找所有符合给定模式 pattern 的 key。支持通配符。
- "*" 匹配一个或多个字符
- "?" 匹配一个字符;·keys ??· 表示匹配两个字符的键值。
- "[abc]" 匹配 abc中的其中一个字符,如 n[ae]me 只能匹配 name、neme;
- `expire <key> <seconds>` //设置<key>过期时间。新的时间会代替旧的时间(如果有的话)。
- ·ttl <key>· // 查看<key>的剩余生存时间(ttl 即 Time To Live)。-2表示已过期被删除;-1表示没有设置过期时间;其他表示剩余时间(单位为秒)。
- ·rename <key> <newKey>· //将<key>重命名为<newKey>。
- <key>不存在时报错。
- <newKey>已经存在时,原来的值将被覆盖!
- ·type <key>` //查看<key>对应的value的数据结构类型。
- 其他key命令可参考 http://doc.redisfans.com/index.html
※,help
- ·help @string· // 查看string类型的 方法列表及其使用方法;
- ·help set· // 查看set 方法(stirng类型中的方法)的使用说明;
- ·help @set· // 查看set类型的方法列表及其使用方法;
※,String 类型
·SET key value [EX seconds] [PX milliseconds] [NX|XX]· //参数不分先后顺序
- `set <key> <value>` // 覆盖原值(如果有的话),清除原有的TTL(如果有的话);
- `set <key> <value> ex <seconds>` // 设置<key>的值并添加过期时间;等价于 ·setex <key> <seconds> <value>`
- `set <key> <value> px <milliseconds>` //设置<key>的值并添加过期时间;等价于 `psetex <key> <milliseconds> <value>`
- ·set <key> <value> nx· // 只有键不存在时才对键进行设置; 等价于 `setnx key value`
- `set <key> <value> xx` // 只有键存在时才对键进行设置;
Redis中实现锁的一种简单方法:
- ·set <key> <value> NX EX <seconds>· // 设置成功返回OK则获得锁。过期时间到了便释放锁。
其他String命令:
- ·get <key>`
- `mget <key1> <key2> <key3>...` // 一次获取多个key的值,如果对应key不存在,则对应返回nil;
- ...
string 类型的应用场景
- 做与统计有关的业务,如新浪微博(微信朋友圈)中的点赞功能;
- 解决多线程的线程安全问题。Redis的key是单线程模式,这就意味着一瞬间只有一个线程能够持有这个key,所以可以使用Redis解决部分涉及线程安全的业务,比如说抢购、秒杀等。
※,List类型
特点:
- 基于Linked List实现;
- 元素是字符串类型;
- 列表头尾增删快,中间增删慢,增删元素是常态;
- 元素可以重复出现;
- 最多包含2^32-1元素;
- 列表的索引:从左至右,从0开始;从右至左,从-1开始;
List类型相关命令:http://doc.redisfans.com/list/index.html
List类型使用场景:
- 处理排名类业务。如新浪微博评论、论坛回帖楼层等。
- 聊天室。
※,Hash类型: key ---> {field:value}
特点:
- 由field和与之关联的value组成map键值对;
- filed 和 value 是字符串类型;
- 一个hash中最多包含2^32-1键值对({field:value});
Hash类型相关命令:
Hash类型使用场景:能使用Hash的时候尽量使用Hash。
- redis每创建一个键,都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等。redis的key相对于值来说,更珍贵!!!所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,在获取key对应的value值时cpu的开销也会更多,Hash结构可以将具有关联关系的一组key-value,存储到同一个hash结构中,从而减少key的数量。
Hash类型不适用的场景:
- 如果我们仅仅只对一个字段设置过期,就不建议使用hash。Redis的key的过期功能只能对键操作,而Hash结构不能单独对某一个filed设置过期功能。
※,Set类型(集合)
特点:
- 无序的、去重的;
- 元素是字符串类型;
- 最多包含2^32 - 1个元素;
Set类型相关命令:
Set类型的使用场景:
- 微博共同关注: 将每个用户关注的用户放在集合中,求交集即可。
※,SortedSet类型(有序集合)
特点:
- 类似Set集合;
- 有序的、去重的;
- 元素是字符串类型;
- 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同;
- 最多包含2^32-1元素;
SortedSet相关命令:
- ·help @sorted_set 查看sortedset的帮助文档·
SortedSet类型的使用场景:适用于需要有序且唯一的业务或操作。
- 音乐排行榜
※,Redis持久化: https://www.cnblogs.com/wozibi/p/11234042.html
※,Redis集群: https://www.cnblogs.com/wozibi/p/11239223.html
※,Redis的三个客户端:Jedis、Redisson、Lettuce
- Jedis的使用:
※,
卍,