【Redis 5种数据类型、RDB/AOF、集群、哨兵、缓存穿透、击穿和雪崩】进阶(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis 5种数据类型、RDB/AOF、集群、哨兵、缓存穿透、击穿和雪崩】进阶(上)

一、Redis安装


1.1 WIndows下安装


1.WIN下载地址:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

2.下载完毕后,解压到工作目录。

3.双击运行服务 redis-server

4.双击客户端 redis-cli


20200802104352852.png


1.2 Linux下安装


1.下载地址:https://redis.io/ ,注意版本号更高的版本需要更高的GCC版本

2.redis-5.0.8.tar.gz

3.上传服务器linux

4. tar -zxvf redis-5.0.8.tar.gz

5. yum install gcc-c++

6. cd redis-5.0.8 -> make && make install

7. 默认redis的安装路径为 : /usr/local/bin

8. 创建redis的配置目录: mkdir /usr/local/bin/redisconf

9. 复制配置文件: cp /home/redis-5.0.8/redis.conf /usr/local/bin/redisconf

10.可以修改为后台启动:vim redis.conf -->daemonize yes

10. 指定配置文件启动redis服务:redis-server /usr/local/bin/redisconf/redis.conf

11. 连接服务:redis-cli -p 6379

12. 关闭服务:shutdown --> exit


1.3 Redis性能测试工具


redis-benchmark

1.测试:100个并发连接,每个并发100000个请求

redis-benchmark -h localhost -p 6379 -c 100 -n 100000


2020080211212521.png

1.4 基础知识


redis默认有 16 个数据库,默认使用第 0 个数据库。

切换数据库:select 3

查看所有的数据K: keys *

清空当前数据库:flushdb,清除所有数据库:flushall

redis为单线程的。基于内存操作。性能瓶颈为机器内存和网络带宽。

多线程CPU切换轮转【耗时间】,上下文切换,不一定比单线程快。

redis所有的数据全部在内存中,单线程效率最高。


二、五大数据类型


2.1 String 类型


设置 set key1 1www

获取get key1

追加 append key “oooo”

获取长度 STRLEN key1

自增 浏览量

set views 0

incr views 自增1

decr views 自减1

incr views 2 设置自增2

对象 : set user:1 {name:wang,age:24}

mset user:1:name wang user:1:age 24

mget user:1name user:1:age


2.2 List类型【栈,队列,阻塞队列】


LPUSH list one 多个值插入到列表的头部

LRANGE list 0 -1 通过区间拿到所有的值

LRANGE list 0 1 通过区间拿到所有的值

Rpush list three 插入队列的尾部

Lpop list 移除左侧第一个值

Rpop list 移除右侧第一个值

lindex list 1 通过瞎做获取值

Llen list 得到列表的长度

Lrem list 1 one 移除一个或者多个指定的值

ltrim list 1 2 从1-2截断下来

lset list 0 kkk ;列表指定下标的值更新为另外一个值


2.3 Set类型


Set中的值是不可以重复的

sadd myset “hello” 添加一个值

SMEMBERS myset 查看某个集合的元素

SISMEMBER myset hello 判断某一个元素是否在这个集合中

scard myset 获取Set集合的个数

srem myset hello 移除某一个值

SRANDMEMBER myset 随机取出一个元素

spop myset 随机移除一个元素

SDIFF key1 key2 差集

SINTER key1 key2 交集

SUNION key1 key2 并集


2.4 Hash类型


Map集合,key-map,值是一个map集合,和String类型差不多

更适合对象的存储


hset myhash field1 wangyin 存储一个值

hget myhash field1 取出一个值

hmset myhash field1 hello field2 word 存储多个k-v值

hmget field1 field2 获得多个值

hgetall myhash 取出所有字段值

hdel myhash field1 删除指定的key字段,对应的value也被删除了

hlen myhash 集合长度

hkeys myhash 获取所有的key

hvals myhash 获取所有的值

hset user:1 name wangyi 存储对象属性值

hget user:1 name 获取对象属性值


2.5 Zset类型


在set的基础之上,增加了一个值 ,set k1 v1 zset k1 score v1


zadd myset 1 one 1 为排序

zadd salary 1000 xiaoming

zadd salary 2000 xiaohong

zadd salary 3000 xiaowang

ZRANGEBYSCORE salary -inf +inf 所有的字段升序排序

ZRANGEBYSCORE salary 0 -1 所有的字段降序排序

ZRANGESCORE salary -inf 2500 withscores 查出所有在2500以内带有分数和名字降序排列

zrange salary 0 -1 查询所有

zrem salary xiaohong 移除一个元素

zscard salary 获取有序集合中的个数


三、特殊数据类型


3.1 Geospatia地理位置


朋友定位,附近的人,打车距离查询


规则:两级数据无法导入,一般通过java批量导入

参数 key 值(经度,维度,名称)

redis在redis3.2之后就推出了,计算地理位置信息,两地距离


geoadd china:city 116.40 39.90 beijing 添加地理位置信息

geoadd china:city 121.47 31.23 shanghai

geoadd china:city 106.50 29.53 chongqing

geoadd china:city 114.05 22.54 guangdong

geoadd china:city 120.16 30.24 hangzhou

geoadd china:city 108.96 34.26 xian

geopos china:city beijing xian 获取指定城市的地理位置

geodist china:city beijing shanghai 默认直线距离单位m

geodist china:city beijing shanghai km 单位为km


附近的人?获取所有的地址 ,通过半径来查询定位


4. georadius china:city 110 30 1000 km 维度 查询附近1000km的城市

5. georadius china:city 110 30 1000 km withdist withcoord count 1 周围人定位信息限定数量1


3.2 Hyperloglog 基数统计


不重复的元素的个数,可以接受误差0.81%

优点:占用的内存是固定的,只需要12K的内存。


页面的访问量【UV】,一个人访问一个网站多次,算作一个人。

传统的方式:Set保存用户ID,如果大量的话,比较麻烦,目的为了计数,而不是保存用户ID。


PFadd mykey a b c d e f g h i h 存储

PFCOUNT mykey 计算基数数量

PFMERGE mykey mykey2 合并


3.3 Bitmap 位图场景


只有0和1,两个状态,操作二进制位


统计疫情感染人数: 0 1 0 1 0 0 0 1

统计同户信息,活跃,不活跃,登录, 不登录, 打卡

356天 = 365 bit 46byte足够


测试只有1-周末的打卡记录:周一:1 周二:0


setbit sign 0 1

setbit sign 1 0

setbit sign 2 1

setbit sign 3 1

setbit sign 4 0

getbit sign 3 查看周三有没有打卡

bitcount sign 打卡天数

bitcount sign 0 3 统计周一到周四的打卡记录天数


四、redis事务操作


1.ACID:要么一起成功,要么一起失败。

2.redis单条命令保证原子性,但是事务不保证原子性 ,所有的命令就会被序列化,会按照顺序执行。

3.redis事务没有隔离级别的概念,所有的命令在事务中,没有直接被执行。

4.**redis的事务:**开启事务【multi】–>命令入队【…】–>执行事务【exec】


20200803085819268.png


5.DISCARD:取消事务


五、redis乐观锁


5.1 悲观锁


很悲观,认为什么时候都会出现问题


5.2 乐观锁


1.很乐观,认为神魔时候都不会出现问题,不会上锁,更新数据的时候会比较一下这个期间是否有人修改过。

2.获取版本号

3.更新时候比较version

如:

set money 100

set out 0

watch money 监控监事测试

multi 开启事务

DECRBY money 20 减少20

INCRBY out 20 增加20

exec 执行事务


六、Jedis 客户端


6.1 maven项目添加pom

         <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
         </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.66</version>
    </dependency>


6.2 连接测试

public class TestJedis{
  public static void main(String[] args){
    Jedis jedis = new Jedis("127.0.0.1",6379);
    // 所有的方法全部在jedis中
    .........
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("hello","world");
    jsonObject.put("name","reba");
    // 事务
    Transaction multi = jedis.multi();
    String result = jsonObject.toJSONString();
    try{
      multi.set("user1",result);
      multi.set("user2",result);
      int i = 1/0; // 模拟异常
      multi.exec(); // 执行事务
    }catch(...){
      multi.discard(); // 放弃事务
    }finally{
      jedis.close(); // 关闭连接
    }
  }
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
42 2
|
5天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
27 2
|
3天前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。
13 1
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
|
4天前
|
缓存 数据库 算法
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流
【5月更文挑战第15天】本文介绍了如何解决缓存击穿和雪崩问题。对于缓存击穿,采用singleflight模式,确保即使热点数据导致大量请求未命中缓存,也只允许一个请求真正查询数据,其他请求等待其结果。对于缓存雪崩,解决方案是在设置过期时间时添加随机偏移量,避免所有数据同时过期。偏移量应与过期时间成正比。此外,限流也是一个重要策略,可以在服务层和数据库层实施,以限制请求流量,保护数据库免受高并发压力。
9 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流
|
5天前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
17 3
|
5天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
15 0
|
5天前
|
NoSQL Redis 数据库
Redis中的常用命令非常丰富,涵盖了各种数据类型的基本操作以及服务器管理和维护的相关指令
【5月更文挑战第15天】Redis常用命令包括通用(如PING、SELECT)、键操作(KEYS、EXISTS、DEL)、字符串(SET、GET)、哈希(HSET、HGET)、列表(LPUSH、LPOP)、集合(SADD、SMEMBERS)和有序集合(ZADD、ZRANGE)等。这些命令用于数据操作及服务器管理,满足不同场景需求。了解更多命令,建议参考Redis官方文档。
16 2
|
5天前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
【5月更文挑战第13天】本文讨论了三种常见的缓存问题:穿透、击穿和雪崩。缓存穿透发生时,请求的数据既不在缓存也不在数据库,可能导致数据库崩溃。缓存击穿指数据仅存在于数据库,热点数据的大量未命中请求会压垮数据库。缓存雪崩则是大量缓存在同一时间过期,引发数据库瞬间压力过大。为应对这些问题,需了解Redis部署(如Cluster或Sentinel)、故障恢复策略,以及公司如何保护数据库。解决缓存问题的经验和预防措施是面试中的重要话题。
12 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
|
5天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
20 1
|
1天前
|
缓存 NoSQL Redis
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?--epoll调用和中断
【5月更文挑战第18天】`epoll`包含红黑树和就绪列表,用于高效管理文件描述符。关键系统调用有3个:`epoll_create()`创建epoll结构,`epoll_ctl()`添加/删除/修改文件描述符,`epoll_wait()`获取就绪文件描述符。`epoll_wait()`可设置超时时间(-1阻塞,0立即返回,正数等待指定时间)。当文件描述符满足条件(如数据到达)时,通过中断机制(如网卡或时钟中断)更新就绪列表,唤醒等待的进程。
23 6