redis详解一
RDBMS
1、结构化组织
2、SQL
3、数据和关系存在一张表中
4、事务一致性
NoSQL
1、 不仅仅是数据
2、没有查询语言
3、键值对,列存储,文档存储,图存储
4、最终一次性
CAP和BASE定理
NOSQL分类
键值对,列存储,文档存储,图存储
KV数据库
新浪:Redis
美团:Redis+Tair
阿里、百度:Redis+Memcache
文档数据库
mongodb,分布式文件存储的数据库,C++编写,处理大量文档。非关系型数据库中最新关系型数据的产品
列存储数据库
HBase
分布式文件存储
图数据库
存储关系型的东西,
Neo4j
一、Redis
内存存储,持久化,效率高,订阅发布系统,地图分析,计时器,计数器。
二、特性
多样数据类型,持久化,事务,集群
三、redis测试性能分析
四、redis基本知识
redis默认有16个数据库,默认使用第0个,可以用select来切换。
keys * 查看所有key
flush db清空当前,flush all清空所有
五、Redis是单线程的,基于内存操作瓶颈,CPU不是Redis的瓶颈,网络和内存才是限制,因为不存在需要等待IO操作所有多线程不能提升速度。redis数据全部在内存里面,所有单线程操作最快,多线程需要cpu之间切换
六、五大数据类型,三大特殊类型
Redis-key,
String,使用场景计数器,统计多单位数量,uid:flow
EXISTS判断是否存在,move key 1移动到其他数据库 ttl key查看时间,type key 查看类型,APPEND KEY V1追加字符串 STRLEN KEY查看长度,incr key decr key 修改数量 incrby key value decrby key value
String,getrange key start end 截取 setrange key offset 1替换,setex set with expire ,setnx set if not exsit,mset k1 v1 k2 v2 k3 v3,mget k1 k2 k3,msetnx k1 v1 k2 v2批量设置一个不成功全部不成功,保证原子性。
set user:1 {name:xiaofeiyang,age:1} 设置对象为json字符串。mset user:1:name xiaofeiyang user:1:age 3 mget user:1:name user:1:age批量设置和获取。getset key v 先返回后设置.
List,可以当栈和队列,两边插入效率高,中间修改效率低。消息排队,消息队列LPUSH,LPOP,栈LPUSH,LPOP
LPUSH List one,获取LRANGE 0 -1获取全部 会倒着取,往头部添加。RPUSH LIST FOUR 往尾部添加。LPOP list头部移除 RPOP list尾部移除。LINDEX list value 取头部,RINDEX list value 取尾部 LLEN判断长度,LREM LIST 1 ONE 移除某个值,ltrim list 1,2 从1到2截取。rpoplpush key key1一边删除一边添加。lset key index value 往list里面设置值,下表不存在报错。linsert mylist before value value在什么前面插入,linsert mylist after value1 value2后面插入
Set,存储多个值,不能重复。共同关注,就是求差集。
sadd key value 加入值。smembers key 查看元素。sismember key value 是否存在元素。scard key查看有多少元素。SRANDMEMBERS KEY随机抽选指定个数元素。spop key随机移除元素。SDIFF KEY1 KEY2 两个相互比较差集。SINTER KEY1 KEY2 交集。sunion key1 key2 并集。
Hash,存储经常变的信息,用户信息,更适合存储对象。string更适合存储字符串。
hset key field1 value,hget key field1,hmset key field1 v1 field2 v2 ,hmget key field1 filed2。hgetall key 。hdel key filed1 删除指定的字段。hlen key 查看长度。HEXISTS KEY FIELD是否存在。HINCRBY KEY FIELD VALUE增加。HDECRBY KEY FIELD VALUE增加。hsetnx key field value 存在不可以设置。hset user:1 name xiaofeiyang。
Zset,有序的set,在set上增加了一个值。存储班级成绩,带权重的消息,topn,排行榜。
zadd k score v表示。zrange k 0 -1 查看所有值。zrangebyscore k -inf +inf withscores,升序排列。zrangebyscore k -inf 2500 with scores。zrevrange k 0 -1。zrem key value 移除一个元素。zcard key 0 -1显示所有元素。zcount key 1 3统计
geospatial
GEOADD china:city 116.40 39.90 beijin添加. GEOPOS china:city beijing chongqin 查看经纬度. GEODIST china:city beijin shanghai km 查看距离. georadius chian:city 110 30 1100 km withdist 或者withcoord count 1查看附近的人显示距离或者精度维度显示多少个人。georediusbymember china:city beijing 4000 km 查询元素附近的人。
hyperloglog,基数,页面的uv。基数统计算法,优点占用内存小
PFADD mykey a b c d,PFADD COUNT MYKEY,PFMERGE MK3 MK1 MK2
bitmap,统计用户信息,活跃不活跃,登陆未登录,打卡。只有两个状态的。setbit sign 0 0,setbit sign 1 1,setbit sign 2, 0。getbit sign 0。countbit sign
事务
redis单条命令保证原子性,多条命令不保证原子性,事务没有隔离级别概念。
redis开启事务,multi,redis入队列,redis执行事务 exec,放弃事务discard。编译型错误,也就是语法错误,所有命令不执行。运行时错误,命令会执行。
监控,乐观锁
watch key,multi 。执行失败要unwatch,再去重新监视。
jedis,集成redis
1、导入依赖
2、编码测试
springboot集成redis
jedis:底层采用多线程,不安全,避免多线程要采用jedis pool阻塞式操作。
lettuce:底层采用netty,实例在多个线程中共享,不存在线程不安全问题,NIO模式。
redis conf文件详解
include 可以导入其他配置文件
bind 127.0.0.1 允许那个ip访问
protected-mode yes
port 端口
daemonize yes 是否开启为守护进程,要手动开启
supervised
pidfile /var/run/pid_6379.pid 进程文件
loglevel notice 日志级别生产环境
database 16默认数据库数量
snapshot 快照
save 900 1 规定时间内执行了多少操作就会持久化
stop-writes-on-bgsave-error yes 持久化出错是否要继续工作
rdbcompression yes 是否开启rdb压缩
rdbchecksum yes 保存rdb文件时是否效验
maxmemory-policy 内存满了的淘汰机制
append on file no 默认不开启,一般rdb就够了
append filename 文件名
appendfsync everysec 每秒同步一次,awalys每次都同步,no就是不执行同步
持久化rdb和aof
rdb文件fork子进程将内存数据写入一个零时文件,然后根据零时文件替换原有rdb文件后生成正式rdb文件。整个过程主进程不进行任何io操作,效率极高。
save满足规则会生成rdb文件,flushdb会产生rdb文件,redis关机时也会产生rdb文件,会默认读取。
适合大规模数据恢复,对数据完整性要求不高。缺点,需要一定时间的间隔,意外宕机会丢失数据,fork子进程会额外占用内存空间。
AOF将所有命令全部记录下来,fork子进程将所有执行的指令以日志的形式记录下来。只允许追加到文件末尾。优点每次修改都会同步,文件完整性好。每秒同步一次,可能丢失一秒的数据。从不同步效率高。
缺点:相对rdb文件来说,文件大,效率比rdb慢。aof可以开启重写,重写策略可以通过auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64m
两种策略都开启时一般会默认找aof文件来进行恢复,rdb不实时但是恢复快适合做备份数据库,aof容易有bug
redis发布订阅,使用场景,实时消息系统。
subscribe key
publish key message
redis集群搭建主从复制
主从复制,读写分离。
1、数据冗余
2、故障恢复
3、负载均衡
环境配置
只配置从库
查看命令info replication
配置文件修改,只需要配置从机
命令如下由
SLAVEOF 127.0.0.1 6379
配置文件配置如下
replicaof 127.0.0.1 6379 password
从机不能写只能读。主机断开,从机依旧连接到主机只是不能进行写操作,主机恢复,从机可以读到主机写入的信息。从机断了,然后恢复立马就可以从主机中读取到数据,第一次连接到主机就会全量同步。后面主机设置数据就是增量复制。
哨兵模式自动选举老大,独立进程监控所有主从redis服务器,哨兵之间还得形成哨兵集群。六个进程齐步走,三台服务器齐步走。哨兵监测到故障后就是主观下线,当其他哨兵也监测到主机故障后并且达到一定值,哨兵之间就会进行一次投票,投票结果由一个哨兵发起,并且进行故障转移,切换成功后就会通过发布订阅模式,让各个哨兵把自己监控的从服务器切换到新的主机下来,这个过程称为主观下线。
编辑哨兵配置文件sentinel.conf
sentinal monitor myredis 127.0.0.1 6379 1 后面的数字,1代表一个slave投票看谁成为主机。redis不好在线扩容,实现哨兵模式的配置很麻烦。