标签列表

everest33

自制力

导航

缓存相关学习记录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

相关网站:

※,简介:

  • 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

※,

 

卍,

posted on 2020-12-29 18:07  everest33  阅读(82)  评论(0编辑  收藏  举报