(一)Redis数据类型

参考:https://blog.csdn.net/exodus3/article/details/118616297

nginx(反向代理器),作用类似于负载均衡器。

分布式集群带来的session问题:

数据存储在nosql数据库,不需要io操作,完全存在内存中,速度快,缓解cpu和io压力。

NoSQL(Not Only SQL),泛指非关系型的数据库。

持久化的含义:可以存储在硬盘中。

nosql的解决:根据数据结构来决定存储方式,打破传统的根据业务逻辑来存储的思维。

前台启动:关掉框框后,就不能再运行;

后台启动:关掉框框后,能再运行;

黄牛相当于redis,单线程,且可以查询多种票,根据票转给对应的人。

安装步骤:https://blog.csdn.net/realize_dream/article/details/106227622

使用Homebrew安装命令

brew install redis

  • Homebrew安装的软件会默认在/usr/local/Cellar/路径下

  • redis的配置文件redis.conf存放在/usr/local/etc路径下

以守护进程的方式运行(后台运行):daemonize no,修改成yes

启动服务:前台:redis-server

后台:redis-cli

步骤:redis-server redis.conf (选择启动的配置文件)

redis-cli -p 6379 连接具体的端口

检测 redis 服务是否启动:

redis 127.0.0.1:6379> PING

关闭服务:

redis-cli shutdown(即:服务器挂掉了)

set key value :如果key存在,会覆盖
setnx key value :如果key存在,会返回0,表示设置失败。

单线程,原子性!

赋值、运算、取值的过程都可能被打断。

下标操作(0开始);最后一位:-1,倒数第二位:-2

setrange key 起始位置 value 覆盖相应长度的,之后的保持不变(起始位置闭区间)。

lpush / rpush key1 v1 v2 v3... 从左边放:最终存放结果为:v3 v2 v1;从右边放,最终结果为:v1 v2 v3

lrange key 起始索引 结束索引:常用于查看键值对的值

spop key 从集合中吐出个值,当值为空之后,对应的key值就不存在了。

hash存储: 取值方便,修改也方便。

存储对象:user相当于用于索引的主属性,所以后面查找之类的都要带上。也就是这里的key。

配置文件:

  • 设置可以接收哪些电脑的访问:bind,如果不注释掉,默认只能苯基访问,通过ip地址不能访问。
  • 保护模式:也要设置为no
  • 连接队列数量限制:tcp-backlog
  • 对客户端心跳检测,如果检测不到心跳,释放连接。
  • pid文件保存每次操作的进程号。
  • radis会存储日志!!不同的日志级别,记录的信息量不一样。
  • 密码设置
  • 连接客户端数量限制: maxclients
  • 设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定:maxmemory

发布的消息是分不同频道的。

发布消息的服务端,订阅消息的叫客户端。感觉是根据频道来区分的。

HyperLogLog (一种数据结构):

HyperLogLog的key对应的value是基数(不重复元素个数)。

使用pfadd启动。

二、Jedis的使用

参考:https://blog.csdn.net/exodus3/article/details/118684735

jedis就是基于java语言的redis客户端,集成了redis的命令操作,提供了连接池管理。
redis-cli是redis官方提供的客户端,可以看作一个shell程序,它可以发送命令对redis进行操作。
对于jedis同理是使用java语言操作redis,双方都遵循redis提供的协议,按照协议开发对应的客户端。

Jedis jedis = new Jedis("192.168.50.128",6379); 访问的redis的ip地址和端口号

String value = jedis.ping(); 测试连接,连接成功,返回pong

jedis.get()

还可以获取set类型等等。

设置、加一、减一等操作。

//设置值到redis
        redisTemplate.opsForValue().set("name","lucy");
        //从redis获取值
        String name = (String)redisTemplate.opsForValue().get("name");

//默认括号里面和返回都是Object类型

复习:

@Test 就是测试类,相当于之前的单元测试。

它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted
set --有序集合)和hash(哈希类型)。

Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

适合场景:

数据结构

String类型:指的是一个key,对应一个String类型类型的value。所以会有:append incr decr的操作

常用命令:set get setnx(去重) append strlen incr incrby decr decrby mget  mset msetnx getrange setra nge setex(设置键值的时候加上过期时间) getex

List类型:value是双向链表,一个key对应一个双向链表

lpush / rpush (向value中加入元素)rpoplpush

lrange lindex linsert lrem lset

Set类型:一个key对应一个set

lset smembers srem spop srandmember  smove

Zset类型:按照评分来给set中元素进行排序

zadd zrange zrangebyscore zincrby zrem zcount zrank

Hash类型:string类型的field和value的映射表,hash特别适合用于存储对象。一个key对应多个field和value映射的组合。

hset hget hmset  hexists  hkeys hvals hincrby hsetnx

Bitmaps:对位操作方便

HyperLogLog:网站访问量统计,统计相关

Redis事务和锁机制

https://blog.csdn.net/exodus3/article/details/118686162

事务:串联多个命令防止别的命令插队

悲观锁:取数据的时候加锁。

乐观锁:更新数据的时候判断一下读和更新之间是否有人做更新操作。

Multi:开始进行组队

Exec:提交开始执行事务

discard:放弃组队

WATCH:乐观锁中的监听,监听的是:从组队到提交执行这一段时间,有没有对key进行过操作。

unwatch:取消组队阶段对key的监听

Redis秒杀案例

https://blog.csdn.net/exodus3/article/details/118881246

ab工具:可以模拟并发场景,是Apache超文本传输协议(HTTP)的性能测试工具。

吞吐率(Requests per second):并发场景下,总请求数 / 处理完成这些请求数所花费的时间

并发连接数:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

并发用户数:一个用户可能同时会产生多个会话,也即连接数。

服务器平均请求等待时间:处理完成所有请求数所花费的时间 / 总请求数。

ab -n 2000 -c 200 -k -p ~/postfile -T application/x-www-form-urlencoded http://192.168.2.115:8081/Seckill/doseckill

其中-n表示请求数,-c表示并发数,-p表示提交的参数所在的文件, -T 表示请求的类型。最后是请求的路径。

这里高并发造成的问题:

1、连接超时问题:意即:加锁之后,超时时间已到,但尚未获得资源。可能是因为:所有连接池都在使用,并且达到了最大池大小。

new jedis(), -> JedisPoolInatance. 改成连接池,会好一点。

连接池:节省每次连接redis服务带来的消耗,把连接好的实例反复利用。

2、超卖问题:

步骤:加乐观锁->事务(组队、执行)

乐观锁:jedis.watch() (通过版本号实现)

->导致库存遗留问题(还有库存,但是因为版本号改变了,认为没有库存了)。

->通过LUA脚本进行解决(LUA脚本,会将所有代码一次提交给redis执行,减少反复连接redis的次数)

Redis持久化操作

https://blog.csdn.net/exodus3/article/details/118881593

持久化的作用:备份数据,需要的时候进行恢复。

RDB:

存的应该是:指定时间间隔内发生改变的数据,还是所有的的->应该是所有的,是一个快照。存的是 key value这样的。

适合数据不敏感的场合:最后一次持久化可能没有触发到需要保存的条件,此时redis挂掉了,所以可能会造成数据丢失。

如果设置的是:30s内有10个key发生改变,就持久化一次。

那么如果这30s内有12个key发生改变,第10个key发生改变的时候会触发一次,然后就重新计数。

持久化保存是替换上一次保存的。所以最终保存的是最后一次持久化的,不是所有时间的!!

恢复速度快:只要redis重新正常启动,就能恢复。

有问题:比如杀死进程,以及  shutdown 这样的操作。

AOF:

存的是所有的写操作的指令。只追加文件。

重新压缩操作:

只记录最终结果,不记录中间过程。比如:set a a1 set b b1->set  a a1 b b1

建议:

  • 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.->redis缓存是保存在服务器内存中的,当服务器重启的时候,就会调用到redis的持久化功能进行重写。

Redis主从复制

https://blog.csdn.net/exodus3/article/details/118881593

  • 读写分离,性能扩展:主机一般写操作,从机一般读操作,能够减小单台服务器的压力。主机一般只有一个,因为写操作不好同步。
  • 容灾快速恢复。

一主两从的具体步骤:

1、创建myredis文件夹
2、复制redis.conf配置文件到文件夹中
3、配置一主多从,创建三个配置文件:

4、不同的服务器需要修改端口号进行实现。

5、修改主从机的关系。

info replication:查看主从复制的信息:是主机还是从机。如果是主机,显示的是已经开启的从机(shut down的不会显示)

slaveof。

默认从机只能做读操作,写操作会报错。

一主二从:

从服务器重启后,自动变成主服务器。当使其重新变成从服务器后,主服务器的所有数据都会复制过来。(小弟不会篡位)

主服务器挂掉之后,从服务器还是从服务器。主服务器重启后,主服务器还是主服务器。(大哥永远是大哥)

薪火相传:

缺点:A->B->C 如果中B服务器挂掉了,C不能够找到A,会无法正常工作。(大哥和小弟的关系同一主二从)

反客为主:

当从机挂掉之后,手动输入命令:slaveof no one 将从机变为主机。

主从复制原理:

哨兵模式:

哨兵可以部署在另一个服务器上。

步骤:

1、建立一主二仆模式。(这里只是为了方便讲解)

2、创建sentinel.conf文件,作为哨兵模式的配置文件。

3、配置sentinel.conf文件监控的主机,以及多少个哨兵同意才将从机设置为主机:

sentinel monitor mymaster 127.0.0.1 6379 1

4、启动哨兵:redis-sentinel /myredis/sentinel.conf。哨兵的信息中会显示监测的主机,以及主机的从机。

5、主机挂掉之后,哨兵就能检测到。会选出新的主机,原来挂掉的主机重启后也会变成从机。(只能有一个皇帝)。

java中实现时,代码的改变:

sentinelSet.add("192.168.11.103:26379"); //哨兵模式检测的主机

jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);//主机的别名

Redis集群

https://blog.csdn.net/exodus3/article/details/118916464

无中心化集群:

任何一台服务器都可以作为入口。如果发现不是改台服务器负责的,就转到其余的对应服务器。

无中心化集群创建步骤:

1、创建并配置几个服务器的配置文件(pid dump文件名 端口号 集群模式打开 节点配置文件名 )。

2、启动6个服务。之后通过 ps -ef | grep redis可以查看所有服务的状态。

3、将6个服务合成一个集群:

要在redis-6.2.1/src目录下进行,因为里面集成了ruby环境。

redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 ……

-replicas 1 :replicas(合成方式,选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。)

后面是IP地址:端口号,这里因为是模拟,是在一个主机上。

测试连接:

1、连接

redis -cil -c -p 6379(-c表示无中心化集群的连接方式 这里写成6380之类的都可以)

之后可以进行正常的读写操作,-c表示重定向,会变到合适的服务器。

2、cluster nodes 命令查看集群信息

shot中key计算的目的:

类似于负载均衡,让几个服务器的压力相差不大。->通过公示计算之后,

不能直接使用mset一次性加入多个key、value了->可以使用组{}进行实现。

查询集群中的值:

cluster keyslot k1 查询的是单个服务器中的,不是整个集群的

CLUSTER GETKEYSINSLOT slot count:单个服务器中的,不是整个集群的

java中集群:

Set<HostAndPort>set =new HashSet<HostAndPort>();
        set.add(new HostAndPort("192.168.31.211",6379));//集群中加入一个

set.add(new HostAndPort("192.168.31.211",6379));//集群中加第二个
        JedisCluster jedisCluster=new JedisCluster(set);
        jedisCluster.set("k1", "v1");

Redis应用问题解决

https://blog.csdn.net/exodus3/article/details/118978186

  • 缓存穿透:

黑客一直试图访问redis和数据库中都不存在的资源,导致db压力过大。

  • 缓存击穿:

突然并发访问数据库的某一个热门数据。

  • 缓存雪崩:

突然并发访问数据库的多个热门数据。

  • 分布式锁:

多个分布式机器共用同一把锁。

  1. 基于数据库实现分布式锁
  2. 基于缓存(Redis等)
  3. 基于Zookeeper

这里讲的是分布式锁:

set users 10 nx ex 12(nx:上锁;ex:设置过期时间)

LUA脚本:原子性操作。

不会发生思锁:设置过期时间。

Redis6.0新功能

https://blog.csdn.net/exodus3/article/details/118978186

疑问:redis和数据库中的数据如何同步?

redis的操作命令

java中处理redis

redisTemplate的命令

radis学习笔记-自用相关推荐

  1. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版

    课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 002.图像色彩空间转换 003.图像对象的创建与赋值 004.图像像素的读写操作 005.图像像素的算术操作(加减乘除4种不 ...

  2. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)

    课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 一.代码+注释 quickopencv.h quickdemo.cpp 源.cpp 二.相关图片 012.图像色彩空间转换(提 ...

  3. Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)

    文章目录 修改虚拟机IP 复制网卡的配置 Vi编辑器的常用命令 实操部分 复制网卡的配置 Hadoop集群初体验 20.secondarynameNode如何辅助管理FSImage与Edits文件 ⭐ ...

  4. Java swing 学习笔记自用

    自用的,不是闲着无聊的建议不要看,不专业不认真不是分享态度,纯属自用. 看的b站视频:Java Swing入门课程_图形界面GUI编程_100集视频教程 讲得贼好贼细,不过时间太长了.而且没学过Jav ...

  5. C语言每日一题:青蛙跳楼梯(学习笔记自用)

    今天做了一道csdn上的题,即一个青蛙一次能跳1或2个梯子,请问他跳n阶梯子有多少种跳法?我当时一开始用的是数学排列组合里的分类计算法,先计算全部一个一个跳.又一次跳了两个.两次跳了两个...后来在看 ...

  6. python(学习笔记-自用)

    目录 1.print() 2.转义字符 3.二进制与字符编码 4.标识符和保留字 5.变量的定义和使用 6.变量的多次赋值 7.数据类型 8.整数类型 9.浮点类型 10.布尔类型 11.字符串类型 ...

  7. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  8. MYSQL学习笔记(自用)第九章

    MYSQL学习笔记(自用)第九章 第一节. 触发器 | Triggers DELIMITER $$CREATE TRIGGER payments_after_insertAFTER INSERT ON ...

  9. MYSQL学习笔记(自用)第七章

    MYSQL学习笔记(自用)第七章 第一节.创建视图| Creating Views USE sql_invoicing;CREATE VIEW sales_by_client AS SELECT c. ...

最新文章

  1. 卷积神经网络四种卷积类型
  2. java生成二维码/java解析二维码
  3. python脚本中执行另一个脚本_如何用python调用另一个python脚本?
  4. 新鲜零食=零食“新”市场+用户“鲜”生活
  5. SSM格式化导出报表时间的格式
  6. 自定义RecyclerView动画——实现remove飞出效果
  7. DOM-12 【模拟桌面待讲评】鼠标事件深入、点击与拖拽分离、双击事件
  8. 服务器不知道怎么回事安卓系统很卡,为什么安卓系统很容易变卡?该怎么解决?看完长知识了...
  9. linux下如何安装配置redis及主从配置
  10. python函数示例_PHP closeir()函数与示例
  11. 大屏实时监控-2019年CSDN博客之星年度总评选(2019-02-07 13:47)
  12. Failure [INSTALL_FAILED_OLDER_SDK] [每件问题100块]
  13. 解决Django Rest Framework中的跨域问题
  14. 安卓数据库的使用方式
  15. Z逆变换(2020.10.21)
  16. Office | Word中插入参考文献
  17. 网页实现中英文切换方式对比与实现
  18. ktv点歌系统服务器破解,欧凯KTV卡拉OK点歌系统
  19. 第三方登录—QQ登录
  20. 示波器X-Y模式分析

热门文章

  1. 《缠中说禅108课》26:市场风险如何回避
  2. 【五一创作】深度学习
  3. Vue中Vuex的五个属性和基本用法
  4. Bitonic sort(双调排序)
  5. iOS App桌面图标和名称
  6. IT Helpdesk的运作方式
  7. python行业发展前景_python行业发展前景
  8. Qt 嵌入式图形开发(入门篇)(转)
  9. 防弹笔记本电脑 - 如何强大是今天的坚固的笔记本电脑
  10. 树莓派有线网络设置_Adafruit的树莓派教程:网络设置