-
三类技术
功能性:java,jsp 扩展性:spring,mybatis 性能:nosql,mq
-
解决问题
解决cpu和内存压力: session放到nosql中,完全在内存中,速度快 解决io压力:
-
nosql是不仅仅是sql
适用场景: 高并发读写 海量读写 数据的高可扩展性 不适用场景: 需要事务支持 基于sql的结构化查询存储
-
大数据:行式数据库,列式数据库,图关系数据库
-
redis底层技术
单线程+多路io复用技术:如黄牛买票,黄牛主动通知 端口号6379:Merz-女演员 默认16个数据库,0-15,默认0号库
-
redis-key操作
查看当前库的key:keys * 设置key value:set key value 判断key是否存在:exists key 判断key的类型:type key 删除key:del key 删除key:unlink key-选择非阻塞删除 设置key的过期时间:expire key 10-秒 查看过期时间:ttl key-[-2表示已经过期,-1表示永不过期] 切换库:select index 查看当前库有多少key:dbsize 清空当前库:flushdb 通杀全部库:flushall
-
Redis-string操作
二进制安全,图片等 value:max=512M 添加:set key value——相同key,后面加的会覆盖 取value:get key 追加:append key value 得到长度:strlen key key 不存在时才能设置:setnx key value 数字值加一/减一:incr/decr key-原子性操作 数字值加步长/减步长:incrby/decrby key 步长 【 i++过程:取值 ++ 赋值 】 同时设置一个或多个key-value:mset key value key value... 同时获取多个value:mget key key... 同时设置一个或多个key-value(当且仅当key不存在):msetnx key value key value...——原子性,一个失败都失败 获得值的范围:getrange key start end 从某个位置开始覆盖:setrange key start value 设置键值,同时设置过期时间:setex key 过期时间 value 设置新值,同时获得旧值:getset key value 数据结构:简单动态字符串,类似于arraylist
-
Redis-list
单键多值 底层:双向链表 从左边/右边插入一个或多个值:lpush/rpush key value value...-从左/右边放 取值:lrange key start end-[0 -1表示取所有值] 从左/右边吐出一个值:lpop/rpop key -[值在键在,值光键亡] 从key1列表右边吐出一个值,插到key2列表左边:rpoplpush key1 key2 按下标获得元素(从左到右):lindex key index 获得列表长度:llen key 在value的前面/后面插入新值:linsert key before/after value newvalue 从左边删除n个value-(从左向右):lrem key n value 将列表key下标为index的值替换成value:lset key index value 数据结构:快速链表-链表+压缩列表
-
Redis-set操作
类似于list,但是自动去重 底层:哈希表 将一个或多个member元素加入key中,已经存在的member元素将被忽略:sadd key value value... 取出集合中的所有值:smembers key 判断集合key是否含有该value值,有1,没有0:sismember key value 返回该集合的元素个数:scard key 删除集合中的某个元素:srem key value1 value2... 随机从集合中突出一个值:spop key 随机从集合中取出n个值,不会从集合中删除:srandmember key n 把集合中的一个值从一个集合移动到另一个集合:smove source destination value 返回两个集合的交集元素:sinter key1 key2 返回两个集合的并集元素:sunion key1 key2 返回两个集合的差集元素-key1中的,不包含key2中的:sdiff key1 key2
-
redis-数据结构hash
key-value集合-【filed value】 给key集合中的filed键赋值value:hset key filed value 从key集合filed取出value:hget key filed 批量设置hash的值:hmset key filed1 value1 filed2 value2... 查看hash表key中,给定域filed是否存在:hexists key filed 列出该hash集合的所有filed:hkeys key 列出该hash集合的所有value:hvals key 为hash表key中的域filed的值加上增量:hincrby key filed increment 将哈希表中的域filed的值设置为value,当且仅当域filed不存在时:hsetnx key filed value 数据结构:压缩列表,哈希表
-
Redis-zset
有序集合-关联评分 将一个或多个member元素及其score值加入到有序集合key中:zadd key score1 value1 score2 value2... 返回有序集合key中,下标在start - stop 之间的元素:zrange key start stop [withscores] 返回有序集合key中,所有score值介于【min,max】之间的成员,按递增排列:zrangebyscore key min max [withscores] 同上,改为从大到小排列:zrevrangebyscore key max min [withscores] 为元素的score加上增量:zincrby key increment value 删除该集合下指定值的元素:zrem key value 统计该集合,分数区间内的元素个数:zcount key min max 返回该值在集合中的排名,从0开始:zrank key value 数据结构:一方面等价于map<string,double>,一方面类似于treeset 底层:hash+跳跃表 【三层间隔跳跃】
-
Redis-配置文件
支持bytes,不支持bit 大小写不敏感 网络:bind:127.0.0.1只支持本地 protected-mode no 保护模式:不支持远程访问 tcp-backlog 511 :backlog是一个连接队列,backlog队列总和=未完成三次握手队列+已完成三次握手队列 timeout 0:redis连接用不超时 tcp-keepalive 300:心跳检测周期,释放连接 daemonize yes: redis后台启动 pidfile: 进程号放入文件 logfile:日志输出路径 日志文件级别-4个级别 database:默认16个库 maxclient:设置redis同时可以与多少个客户端进行连接 maxmemory:redis可以使用的内存量 maxmemory-policy:移除规则 maxmemory-samples:样本数量
-
redis-发布订阅
消息通信模式:发送者发送消息,订阅者接受消息-redis客户端可以订阅任意数量的频道 打开客户端订阅:subscribe channel1 打开客户端发布:publish channel1 hello
-
redis-新数据类型-bitmaps
位操作 不是数据类型,实际上就是key-value字符串 设置:setbit key offset value-偏移量大,会慢 取值:getbit key offset 统计字符串被设置为1的数量:bitcount key 如上,还可以加下标:bitcount key start end 【-2表示倒数第二个,-1表示最后一个】 复合操作(交集,并集,与或非),操作结果保存到destkey中:bitop and(or/not/xor)destkey 【key...】 bitmaps&set:bitmaps内存小,
-
redis-新数据类型-hyperloglog
统计页面访问量,搜索记录,独立ip 计算基数(去重):不重复元素 添加指定元素到hyperloglog中:pfadd key element... 计算hll的进似基数:pfcount key 将一个或多个hll合并,结果放到另一个hll中:pfmerge destkey sourcekey...
-
redis-新数据类型-geospatial
地理信息的缩写 添加地理位置(经度,纬度,名称):geoadd key longgitude latitude member... 获得指定坐标的坐标值:geopos key member... 获得两个位置之间的直线距离:geodist key member1 member2 [m/km...] 以给定的经纬度为中心,找出某一半径内的元素:georadius key longitude latitude radius [m/km ]
-
redis-jedis操作-测试
客户端工具-通过java操作redis maven导入依赖 创建jedis对象:Jedis jedis=new Jedis(host:"主机号",port:"端口号-6379"); 测试:String value=jedis.ping();//bind 绑定的主机-注释掉,protected-mode no:保护模式改成no,虚拟机的防火墙也要关闭 jedis-api:
-
springboot整合redis
pom.xml加入redis依赖,common-pool2连接池依赖 配置redis,||如地址,端口号... 添加redis配置类
-
redis-事务和锁机制
单独的隔离操作 串联多个命令,防止别的命令插队 muti:开启事务,命令组队阶段 exec:执行阶段 discard:组队过程中,可以通过discard放弃组队 悲观锁:先上锁 乐观锁:版本号要同步更新,在执行muti之前,先执行watch key...,可以监视一个或多个key,如果在事务执行之前,这个(这些)key被改动,那么事务将被打断 redis事务三特性:【1:单独的隔离操作。2:没有隔离级别的概念。3:不保证原子性-没有回滚】
-
秒杀案例-基本实现
商品库存-1。 秒杀成功者+1
-
redis-持久化操作-rdb
内存中的数据直接写到文件中去 在指定的时间间隔内,将内存中的数据集快照写入磁盘 dump.rdb 持久化文件 save:全部阻塞,手动保存 bgsave:后台异步,自动保存 rdb持久化配置文件 过程:redis单独创建一个fork子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了,再用临时文件替换上次持久化好的文件(dump.rdb) 临时文件的作用,是为了不修改原文件,在挂掉的时候还能恢复 如果需要大规模数据的恢复,且对于数据恢复的完整性不敏感时,rdb比aof高效 rdb的缺点:最后一次持久化的时候可能造成数据的丢失 -redis持久化一部分后突然挂掉 fork:写时复制技术 redis的恢复:【1:备份。2:改一下名字。】 rdb优势:适合大规模恢复,且数据完整性不敏感 劣势:fork过程中,内存中的数据被复制一份,空间的浪费
-
redis-持久化操作-aof
append only file 以日志的形式来记录每个写操作(增量保存) ,将redis执行过的所有写指令记录下来,只追加文件不可以改写文件 aof默认不开启 aof文件的保存路径,同rdb的保存路径相同 aof和rdb同时开启,系统默认取aof的数据(数据不会存在丢失) aof的恢复同rdb aof的异常恢复:如遇到aof文件损坏,可恢复 aof配置:【1:aof同步频率设置。2:rewrite压缩-繁琐命令用一条命令写出】 aof持久化流程:【1:客户端的请求写命令会被append到aof缓冲区内。2:aof缓冲区根据aof持久化策略将操作同步到磁盘的aof文件中。3:aof文件大小超过重写策略或手动重写时,会对aof文件rewrite重写,压缩aof文件容量。4:redis服务重启时,会重新load加载aof文件中的写操作达到数据恢复的目的】 优势:备份机制更稳健,丢失概率更低 劣势:占用空间多,因为记录操作,每次写都同步,有性能压力 官方推荐,两个都启用,
-
redis-主从复制
主机数据更新后根据配置和策略,自动同步到备机的 master/slave 机制,master以写为主,slave以读为主 一主多从 为防止主机挂掉的影响可以,做成集群 好处:【1:读写分离。2:容灾快速恢复。】
-
主从复制-搭建一主多从
1:创建/myredis文件夹 2:复制redis.conf配置文件到文件夹中 3:创建3个配置文件-不同端口 4:在3个配置文件中写入内容-include引入配置文件的公共部分再修改 5:启动三台redis服务【查看当前主机的运行状况 - info replication|| 在从机上执行:slaveof 127.0.0.1 6379 配置从机】
-
主从复制-复制原理,一主二从
1:从机挂掉后再重启,还是主机 2:再设置为从服务器后,会把主机的数据从头开始复制 3:主机挂掉后,从机还是从机 复制原理: 【 1:从及连上主机,从机向主机发送数据同步消息 2:主机接到从机的同步消息,把主机数据持久化到rdb文件,把rdb文件发送给从机,从机拿到rdb进行读取——全量复制 3:每次主机进行写操作后,和从机进行数据同步——增量复制 】
-
主从复制-薪火相传,反客为主
薪火相传: 从机:slaveof 127.0.0.1 6381(另一个从机端口号) 从机下可以再挂从机 反客为主: 当一个master宕机后,slave可以变成主机:slave no one 将从机变成主机
-
主从复制-哨兵模式
反客为主的自动版:能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库 1:自定义的/myredis 目录下新建sentinel.conf 文件,名字绝不能错 2:配置哨兵,填写内容:sentinel monitor mymaster 127.0.0.1 6379 1[至少多少个哨兵同一迁移的数量] 3:slave/replica-priority 100:从机切换主机的规则【选择条件:1,优先级靠前的。2,偏移量最大的。3,runid最小的从服务】,值越小优先级越高 缺点:复制延时 可以用jedis操作
-
redis集群
容量不够,redis如何进行扩容? 并发写操作,redis如何分摊压力? 集群解决。 主机代理:主机挂掉,从机上 无中心化集群配置:任何一个服务器,都可以作为集群入口,可以互相进行访问 实际中,一个服务占用一台linux系统 redis集群实现了对redis的水平扩容
-
redis集群
1:删除所有rdb文件,制作6个实例,不同的端口号 2:redis-cluster配置修改 3: /src 下,将6个主机变成集群,主机ip:端口号 4:-c ,采用集群策略连接
-
集群操作和故障恢复
redis cluster 如何分配这6个节点 ——cluster -replicas 1 表示我们希望为集群中的每个主节点创建一个从节点 分配原则:保证主与从不在一个ip地址上,为了防止系统挂掉 slots:插槽,一个redis集群中包含16384个插槽,根据key计算插槽 在集群中录入值:set key value 录入多个值:mset name{user} lucy age{user} 20 查询插槽值:cluster keyslot key 查看自己插槽中的值:cluster countkeysinslot 插槽值 返回插槽中键的数量:cluster getkeysinslot slot count 故障恢复:主机挂掉后再恢复,会变从机 cluster-require-full-coverage:yes.如果某一段插槽的主从全挂掉,那么整个集群全挂掉,如果为no,则只是那一段的插槽不能用
-
集群的jedis开发
jedis redis集群好处:【实现扩容,分摊压力,无中心配置相对简单】 redis集群的操作:【多键操作不支持】
-
Redis-缓存穿透
缓存穿透:key对应的数据源不存在,每次对key的请求从缓存获取不到,请求会压到数据源,从而可能压垮数据源 解决方案:【 1:对空值缓存,设置空结果的过期时间很短 2:设置白名单,bitmaps定义可访问名单 3:采用布隆过滤器,实际上是一个很长的二进制向量和一系列随机映射函数 4:进行实时监控 】
-
redis-缓存击穿
缓存击穿:某个key对应的数据存在(热门访问key),但是在redis中过期,但是大量请求过来,这些请求发现缓存过期一般会从后端db加载数据并回设到缓存,这个时候大并发的请求可能瞬间把后端db压垮 解决方案: 【 1:预先设置热门数据,加大热门key的时长 2:实时调整,调整key的过期时长 3:使用锁, 】
-
redis-缓存雪崩
缓存雪崩:在极少的时间内,出现了大量的集中key过期 解决方案:【 1:构建多极缓存架构(ngix+redis+其他缓存) 2:使用锁或队列,保证不会高并发 3:设置过期标志更新缓存, 4:将缓存失效时间分散开 】
-
redis-分布式锁(设置锁和过期时间)
跨jvm [ 1:基于数据库实现分布式锁 2:基于缓存(redis等) 3:基于zookeeper ] redis实现分布式锁:setnx命令-del即释放锁——/设置过期时间//上锁的时候就设置过期时间(set key 10 nx ex 12)
-
redis-分布式锁(uuid防止误删)
分布式锁中的问题,a进程因卡顿而释放别的进程的锁 解决方案:set lock uuid nx ex 10,释放锁的时候,判断当前uuid和要释放锁uuid是否一样
-
redis-分布式锁(lua保证删除原子性)
原子性操作问题:正要删除,还未删除,锁到了过期时间,自动释放,b得到锁后,a进行删除时,会释放b的锁 lua脚本:支持原子性的操作-用脚本判断uuid是否一样 uuid加lua脚本
-
redis-新功能介绍
acl:访问控制链表 添加用户:acl setuser lucy 查看当前用户:acl whoami ... io多线程:专用于网络编程 工具支持cluster