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