客户通过 nginx 来访问服务器,服务器有多台在第一个服务器登录后产生一个 session
第二次登录进行服务器2而服务器2没有session 如何进行session的同步?
作为缓存使用一些常用的操作直接放在 nosql 中,减少数据库的压力
not only sql 泛指非关系型数据库,以简单的 key-value 存储,极大的增加了数据库的扩展能力
适用场景
不适用
redis 是单线程+多路io复用技术
多路复用就像js中的异步任务,发布一个异步任务不需要等待排队,干其它事,等这个事干完了就使用会提醒你
redis 字符串(String)
redis 列表(list)
redis 集合(set)
redis 哈希(hash)
redis 有序集合 Zset 与set非常像但与set不同的是zset每一个成员都关联了一个评分,这个评分可以从最低到最高来排序集合中的成员
# 1. 商品的基本信息
mysql,oracle
# 2. 商品的描述
mongodb
# 图片
分页式文件系统 fastDfs
淘宝 tfs
google gfs
hadoop hdfs
阿里云的 oos
# 商品的关键字
solr elasticsearch
iserach 多隆
redis发布与订阅是一种消息模式:发送者发送信息,订阅者接收信息,中间通过监听一个频道来实现的。
redis客户端可以订阅任意数量的频道
现代计算机使用二进制位作为信息的基础单位,合理地使用操作位能够 有效地提高内存使用率和开发效率。
redis提供了bitmaps这个数据类型可以实现对位的操作
setbit key 偏移量[下标] 数字 如果偏移量太大会影响redis的速度
getbit key 偏移量 获取某个偏移量的值
bitcount key begin last 统计字符串被设计成1的bit数量last可为负数
bitcount key
在工作中,我们经常会遇到与统计相关的功能需求,比如统计pv(pageView页面访问量),可以使用redis的incr与incrby实现。
但像uv(uniqueVisitor,独立访客)、独立ip数、搜索记录数等需要去重和计数的问题如何解决?这种求集合不重复元素的个数的问题简称基数问题。
hyperLogLog优点是当输入元素的数量或者体积非常非常大的时候,所需要的空间问题固定的,并且很小的。
但是,因为它只会根据输入元素的个数来计算基数,而不会储存输入元素本身,所以它不能像集合一样输出输入的各个元素。
在redis 3.2中增加了对geo类型的支持。geo->geographic 地理信息的缩写。就是元素的二维坐标,在地图上就是经纬度,redis基于该类型,提供了经纬度设置,查询,距离查询,经纬度hash等常见操作。
geoadd[longitude latitude member…]添加地理位置(经度,纬度,名称)
两极无法添加,一般会下载城市数据,直接通过 java程序一次性导入,有效的经度从-180到180,有效的纬度从-85到85度,当坐标超出指定范围会报一个错误,已经添加的数据是无法两次添加的
geopos [member…]获得指定地区的值
geodist 获取两个位置意间的直线距离 单位 m表示单位为米 km表示单位为千米 mi代表单位为英里
ft表示单位为英尺如果用户没有显式地指定单位参数,那么geodist默认使用m
geoadius radius m|km|ft|mi 以给定的经纬度为中心某一半径内的元素
redis事务是一个单独的隔离操作:事务中所有 命令都会序列化地按顺序地执行。事务在执行的过程中,不会被其他客户端送来的请求所打断。
redis事务的主要作用就是串联多个命令防止别的命令插队
Muti从输入Muti命令开始,输入的命令都会依次进入命令队列中,但不会执行,直至输入Exec后,redis会将之前的命令队列的命令依次执行,组队的过程中可以通过discard来放弃组队
事务的错误处理
组队中某个命令出现了报告错误,执行时整个队列都会被取消
如果执行阶段某个命令出现错误,则只有报错的命令不会执行,而其他的命令都会执行不会回滚。
redis 乐观锁
在执行multi之前,先watch key1[key…],可以监视一个(多个key),如果在事务执行之前这个key其他命令所改动,那么事务将被打断。
unwatch
取消watch命令对所有key的监视
如果执行watch命令之后,exec命令或discard先执行了的话那么就不需要再执行unwatch命令了
RDB (Redis database)
隔一段时间将内存中的值写入磁盘,也就是行话讲的snapshot快照,恢复时是将文件直接读取到内存中。
redis会单独创建(fork)-子进程来进行持久化,会将数据写到一个临时文件中,待持久化都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程不进行任何io操作,确保了极高的性能如果需要进行大规模数据的恢复,且对数据恢复的完整性不是非常敏感,那RDB比aof的方式更加高效,RDB的缺点是最后一次的持久化的后的数据可能会丢失。
在linux系统中,fork会产生一个父进程完全相同的子进程,但子进程在此后会调用 exec系统调用,出于效率考虑,linux中引用了’写时复制技术’,一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生才会将父进程复制一份子进程
redis默认生成文件会生成登录的位置中,如果需要修改默认生成文件位置我们需要修改conf配置文件
手动保存快照
命令save:只管保存,其它不管,全部阻塞
save vs bgsave
aof (Append of File)
以日志的形式来记录每一个写操作,将redis执行中所有的写指令 记录下来,只许追加但不可以改写文件,redis启动之初会读取,重新构建数据,换言之,redis重启的话就根据日志的内容将写指令全部执行一遍完成恢复
aof默认没有开启,需要手动在配置文件中进行配置
可以在redis.conf配置文件名,默认为appendonly.aof
aof文件保存路径默认与rdb的路径一致
注意aof默认会记录所有写的操作如果不小心执行flushdb指令需要在日志文件中将这条指令清除才可以恢复。
aof故障恢复
aof同步频率设置
rewrite
aof采用追加的方式,文件会越来越大,为避免这种情况,新增了重写机制,当aof文件的大小超过所设定的阈值时,redis就会启动aof文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用指令 bgrewriteaof
redis如何实现重写
何时重写
读写分享,性能拓展,容灾快速恢复
配从(服务器)不配主(服务器)