redis学习汇总
1、什么是redis
1.1 redis特点
(1)key-value类型的nosql的非关系型数据库
(2)数据都加载在内存中,也可以持久化到磁盘中,与memcached显著的区别
(3)读写时以单线程的方式进行的,但 I/O 效率很高,读效率为110000/s ,写效率为 80000/s
(4)支持的数据类型丰富
2、redis基础数据类型
2.1 都有那些类型
(1)String
(2)Hash
(3)List
(4)Set
(5)sortedSet
2.2 具体使用
(1)String : set name shtdhr ; get name ;特殊用法 计数 incr increasetest
(2)List:rpush mylist aaa ;rpush mylist bbb ;rpush mylist ccc ;lpop mylist
(3)Set:sadd mySet aaa ;rpush mySet aaa ;rpush mySet bbb ;range mySet 0 10
(3)zSet:zadd myZSet 0 aaa ;rpush myZSet 1 aaa ;rpush myZSet 2 bbb ;zrangebyscore myZSet 0 10
(5)hash:hmset user name shtdhr age 18 sex 1 ; hset age 19 ;hget user name ;hget user age ;hget user sex
3、redis如何从海量数据中模糊查询某一key
3.1 keys
使用:keys skr-* ;查询以skr-为开头的 所有 key
优点:keys 命令 一次性返回所有相关联的数据
缺点:由于 redis 是以单线程方式执行指令的,当数据量过大时,会造成I/O阻塞,造成数据库卡顿
3.2 scan
使用:scan 0 match skr-* count 10
命令解读 scan cursor match key count number,cursor 为游标开始位置 为 0 ,number 为一次最大读取 数量,通过for循环 不断获取本次查询结束的游标位置,然后进行替换,当cursor 为 0 时 表示一次完整查询的结束
优点 :每次 获取的 最大数量时固定的,不会给数据库造成过大压力,
缺点:每次返回的数据量不固定,0 ~ count 之间,可能存在返回 0个 ,且
有可能会返回 重复数据,所以拿到的数据需要去重
4、redis 分布式锁实现方案
4.1 setnx
例子:setnx mylock 1;expire mylock 10 ;设置锁 mylock ,十秒后失效
优点:setnx 指令 ,当且仅当 setnx key 不存在时返回成功,否则失败,并通过 expire 指令 防止锁一直被占用 而使其他线程无法获取到锁
缺点:由于使 由 setnx 和 expire 两条命令生成,违反了原子性操作,极端情况下会存在 只执行前半部分 而后半部分不执行,造成锁被永久占用,其他线程永远无法获取到锁的情况
4.2 set version 2.11.6后
SET key value [EX seconds] [PX milliseconds] [NX|XX]
例子: set mylock2 1 ex 10 nx
优点:实现了原子操作
缺点:
5、redis 日志记录方式
5.1 RDB(快照)全量备份
命令 save ;bgsave
解读:save 命令方式:使用save 命令时会以单线程方式执行,此时其他客户端无法进行读写操作,当save命令执行完成后,才会允许使用,所以当数据量过大时不要使用save命令进行备份操作,慎用!!!!
bgsave命令方式: 使用bgsave 命令时,主线程会 fock一个新的线程,代替主线程执行save操作,此时不会对其他客户端的读写造成影响,并且备份方式遵循copy-on-write(写时复制)技术,既 当且仅当 子线程需要 写操作时,主线程会给它一个副本,此时,子线程读取此副本中的数据进行保存,其他客户端的写指令对其并不影响
开启方式:redis 默认 开启 rdb 持久化方式,并且使用bgsave命令进行操作,按某一时间端内的写操作数据数量判断是否要进行备份
5.2 AOF(append only file)增量备份写操作
开启配置:redis.conf 中 找到 appendonly 属性 默认为 false ,开启为true