redis知识点
为什么使用
①解决应用服务器的cpu和内存压力
②减少io的读操作,减轻io的压力
③关系型数据库的扩展性不强,难以改变表结构
优点:
①nosql数据库没有关联关系,数据结构简单,拓展表比较容易
②nosql读取速度快,对较大数据处理快
适用场景:
①数据高并发的读写
②海量数据的读写
③对扩展性要求高的数据
不适场景:
①需要事务支持(非关系型数据库)
②基于sql结构化查询储存,关系复杂
是什么:
Redis是一个开源的key—value型数据库,支持string、list、set、zset和hash类型数据。对这些数据的操作都是原子性的,redus为了保证效率会定期持久化数据。
使用场景:
1、 配合关系型数据库做高速缓存
①缓存高频次访问的数据,降低数据库io
②分布式架构,做session共享
2、 可以持久化特定数据。
①利用zset类型可以存储排行榜
②利用list的自然时间排序存储最新n个数据
Linux下redis:
1、 redis目录:usr/local/bin
2、 linux下redis常用命令:
① redis-benchmark:性能测试工具
②redis-server:启动redis服务器
③redis-cli:启动redis客户端,操作入口
Redis基础知识
1、 端口:6379
2、 默认16个数据库,下标从0开始
3、 单线程:redis是单线程+io多路复用:检查文件描述的就绪状态
Memchached:多线程+锁
4、redis数据类型:String set list hash zset
Redis命令:
1、 key操作
a) keys * 查看当前库所有的键
b) exists key 判断是否存在key
c) type key 查看键的类型
d) del key 删除某个键
e) expire key second 设置键过期时间 单位是s秒
f) ttl key 查看还有多少秒过期 -1表示用不过期 -2表示已经过期
g) move key db 把键移到另一个库下
h) dbsize 查看数据库key的数量
i) flushdb 清空当前库
j) flushall 通杀所有库
2、 String类型:String是二进制安全的,可以包含任何数据源,最大512m
a) get key 查看对应的键值
b) set key value 添加键值对
c) append key value 将给定的value 追加到原值的末尾
d) strlen key 获取值得长度
e) setnx key value 当key 不存在的时候设置key值
f) incr key 将key中储存的数字加1,如果为空,则值为1
g) decr key 将key中储存的数字减1,如果为空,则值为-1
h) incrby/decrby key 步长 将key中的数字增减
i) 批量处理:
- mset key1 value1 key2 value2 同时设置多个键值对
- mget key1 key 2 通知获取多个值
- msetnx key1 value1 key2 value2 当给定的key都不存在
- getrange key 起始位置 结束位置 类似sunstring
- setrange key 起始位置 结束位置 类似sunstring覆盖原始值
- setex key 过期时间 value 设置键值的同时,给定过期时间
- getset key value 以旧换新,设置了新的值同时得到旧值
3、 List:链表
a) 特点:
- 单键多值
- Redis列表是简单的字符串列表,从左或者从右插入
- 底层是双向链表,对两端的操作性能很高,通过下标查询性能很 低
b) lpush/rpush key value1 value2 .. :从左或从右插入多个值
c) lpop/rpop key 从左边或右边吐出一个值,值关键亡
d) rpoplpush key1 key2 从key1 右边吐出一个值到key2的左边
e) lrange <key> <index> 按照索引下标获取元素 从左到右
f) lindex <key> <index> 按照索引下标获取元素 从左到右
g) llen <key> 获取列表长度
h) linsert <key> before <value> <newvalue> 在key中value前插入newvalue
4、 Set:类似list的无序集合,保证列表中不会有重复数据,底层是一个value为null的 hash表
a) sadd <key> <value1> <value2> 将多个元素加入到key中,重复值忽略
b) smembers <key> 取出该集合的所有值
c) sismember <key> <value> 判断集合key中是否有该value值 有就1 没有0
d) scard <key> 返回该集合的元素个数
e) srem <key> <value1> <value2> 删除集合中的某个元素
f) spop <key> 随机吐出该集合一个值
g) srandmember <key> <n> 随机从集合中取出n个值,不会从集合中删除
h) smove <key1> <key2> <value> 将key1中的value 移动到key2 中
i) sinter <key1> <key2> 返回两个集合的交集元素
j) sunion <key1> <key2> 返回两个集合的并集
5、 hash:键值对集合,类似map<String,Object>
a) hset <key> <filed> <value> 给key 集合中的file 键赋值value
b) hget <key1> <field> 从key1 集合file取出value
c) hmset <key1> <field1> <value1> <field2> <value2> 批量设置hash的值
d) hexists <key> <field> 查看key中的field 是否存在
e) hkeys <key> 列出key中所有的filed
f) hvals <key> 列出该hash集合中所有的value
6、 zset :与set集合非常相似,每个成员都关联了score,可以用来排序
a) zadd <key> <score1><value1><score2><value2>将一个或多个元素以及score加入zset
b) zrange<key><start><stop> withscore 返回下标在区间内的集合,带有score
c) zrangebyscore <ket> <min> <max>[withscore] [limit offset count] 返回key中 score介于min和max中的成员,升序排列
d) zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count] 降序
e) zincrby <key> <increment> <value> 在key集合中的value上增加increment
f) zrem <key> <value> 删除key集合下的指定元素
g) zcount <key> <min><max> 统计 区间内的元素个数
h) zcord <key> 获取集合中的元素个数
i) zrank <key><value> 查询value在key中的排名,从0开始
redis持久化:
1、 两种方式:rdb(redis database)和aof(append of file)
2、 RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中
a) 持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失
b) Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程
c) Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb
d) Rdb保存策略:
i. 900s 1 file change
ii. 300s 10file change
iii. 60s 10000file change
e) Rdb的备份:
i. config get dir 得到备份的文件夹
ii. 复制备份文件
f) Rdb恢复:
i. 关闭redis
ii. 将备份文件复制到工作目录下
iii. 启动redis,自动加载
3、 AOF : 以日志形式记录每个写操作,启动时通过日志恢复操作
a) 开启AOF:默认不开启,进入redis.conf找到appendonly yes打开
b) 修复AOF:redis-check-aof –fix appendonly.aof
c) 同步频率:每秒记录一次,如果宕机该秒记可能失效
d) Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志
4、 RDB和AOF对比
a) RDB优点:
i. 节省磁盘空间
ii. 恢复速度快
b) ROD缺点:
i. 数据太大时,比较消耗性能
ii. 一段时间保存一次快照,宕机时最后一次可能没有保存
c) AOF优点:
i. 备份机制更加稳健
ii. 可读的日志文件,通过aof恢复更加稳健,可以处理失误
d) AOF缺点:
i. 比RDB更占磁盘
ii. 备份速度较慢
iii. 每次都同步日志,有性能压力
5、 RDB和AOF哪个好
a) 官方推荐都启用
b) 对数据不敏感,单独用RDB
c) 不建议单独使用AOF
d) 若作为纯缓存使用,可以都不开启
Redis事务:输入multi,输入的命令都会依次进入到队列中,但不会执行,直到输入exec,redis会将之前命令队列中的命令依次执行,通过discard可以放弃组队。
1、 主要作用:序列化操作,串联多个命令防止别的命令插队
2、 悲观锁:每次拿到数据的时候都会上锁,或者等待别人处理完再去拿锁,传统的关系型数据库里边很多用到了这种锁机制,比如行锁、表锁、读锁、写锁
3、 乐观锁:每次拿数据的时候总认为别人不会修改数据,所以不会上锁。但是更新的时候回去判断别人有没有更改数据,使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。
4、 Redis使用乐观锁:redis就是利用check-and-set机制实现事务
5、 三大特性:
a) 单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。不会被其他客户端打断
b) 没有隔离级别概念:队列中的命令没有提交之前不会被执行,事务外不能查看事务内的更新
c) 不能保证原子性:跳过错误,依旧执行,没有回滚
Redis订阅/发布:是进程中的一种消息通信模式,发送者pub发送消息,订阅者sub接收消息 剩下的略。。。
Redis主从复制:
1、 是什么:主从复制就是主机数据更新后根据配置和策略,自动同步到备份机的master/slaver机制,master写为主,slave读为主
2、 用处:
a) 读写分离,性能拓展。
b) 容灾快速恢复
3、 配置服务器(配从不配主):
a) 拷贝多个redis.conf文件
b) 开启daemonize yes
c) Pid文件名字
d) 指定端口
e) Log文件名字
f) Dump.rdb名字
g) Appendonly 关掉或者换名字
Jedis:
1、 所需jar包:
a) common-pool-1.6jar包
b) jedis-2.1
2、 获取jedis对象:Jedis jedis = new Jedis(“ip” ,端口号);
集群分布:实现对redis的水平拓展,启动n’的redis节点,将整个数据分布在这n个节点中
1、 配置conf文件:
a) 拷贝多个redis.conf文件
b) 开启daemonize yes
c) Pid文件名字
d) 指定端口
e) Log文件名字
f) Dump.rdb名字
g) Appendonly 关掉或者换名字
2、 配置cluster文件:
a) cluster-enable yes 打开集群模式
b) cluster-config-file xxx.conf 设置生成的节点配置文件名
c) cluster-node-timeout 15000设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换