Redis:易扩展,大数据量高性能,多样灵活的数据类型,
Nosql数据库的四大分类:KV键值,文档型数据库magoDB,列存储数据库Hbase,图关系数据库Info数据库;
CAP+BASE:
传统数据库:
A原子性 事务里的操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作失败,整个事务就失败,需要回滚;
C一致性 数据库要处于一致性
I 独立性 并发的事务之间不会相互影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响;
D 持久性
持久性是指一旦事务提交后,他所做的修改将会永远被保存在数据库上,即使出现宕机也不会丢失
Nosql数据库:
C:强一致性
A:可用性
P:分区容错性
CAP的3进二:
Redis是Cp,传统数据库为CA;
AP大多数网站架构的选择;
Base就是为了解决关系数据库一致性而引起的可用性降低而提出的解决方案;
Base是下面三个术语的缩写:
基本可用:
软状态:
最终一致:
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。大型系统往往由于地狱分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外外一种方式来完成,这里Base就是解决这个问题的办法;
分布式+集群:
1. 分布式:不同的多台服务器上面部署不同的服务模块,他们之间通过RPC之间通信和调用;对外提供服务和组内协作
2. 集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问;
Redis:
单进程,默认16个数据库,类似数组下标从零开始,初始默认使用零号库;
Select命令切换数据库;
DbSize查看当前数据库的Key数量;
FlushDb清空当前库
FlushAll 通杀全部库
统一密码管理,16个数据库都是同样密码,要么都OK,要么一个也连接不上;
Redis索引都是从零开始;
键key:keys*
Exists key的名字,判断某个key是否存在;
Move key +库名-->当前库就没有了此key,被移除了
Expire key 秒钟:为给定的key设置过期时间;
Ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已经过期;
Type key:查看你的key是什么类型;
常用五大数据类型:
String:
字符串
单值单value;
Set/get/del/append/strlen key
Incr/decr/Incrby/decrby 一定要是数字才能进行加减
Getrange/setRange 设置或得到
Setex/Setnx
Mset/mget/msetnx
Getset
List列表 链表
它是一个字符串链表,left、right都可以插入添加
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全部移除,对应的键也就消失了;
链表的操作无论是头和尾效率都极高,但假如是对中间元素操作,效率就很惨淡了;
Lpush/rpush/lrange
Lpop/rpop
Lindex,按照索引下标获得元素(从上到下)
Llen
Lrem key 删N个Value
Ltrim key 开始index 结束index ,截取指定范围的值后再赋值给key
Rpoplpush 源列表 目的列表
Lset key index value
Linsert key before/after 值1 值2
Set(集合)无序:
单值多value
Sadd/smembers/sismember
Scard获取集合里面元素的个数
Screm key value 删除集合中元素
Srandmember key 随机出个整数
Spop key 随即出栈
Smove key1 key2 将key1里的某个值赋给key2
数学集合类: 差集:sdiff
交集:sinter
并集:sunion
Hash类似Java里Map,Java里面的Map<String,Object>
KV 模式不变,但Value是一个键值对
Hset/hget/hmset/hmget/hgetall/hdel
Hlen
Hexists key 在key里面某个值的key
Hkeys/hvals
Hincrby/hincrbyfloat
Hsetnx
Zset(有序集合):
Set: k1 v1 v2
Zset: k1 score1 v1 score2 v2
Redis zset和set一样也是String类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型分数,redis正是通过分数来为集合中的成员进行从小到大的排序
持久化:Zset的成员是唯一的,但分数(score)却可以重复;
Zadd/zrange
Zrangebyscore key 开始score 结束score
Zrem key 某个score下对应的value值,作用是删除元素;
Zcard/zcount key score 区间/zrank key values值,作用是获得下标值/zscore key对应值,获得分数
Zrevrank key values 逆序获得下标值
Zrevrange 逆序
Zrevrangebyscore key 结束score 开始score
配置文件:
Units单位
Incudes
Genreal通用
SnapsShotting
I. stop-writes-on-bgsave-error:后台保存出错前台停止写的操作
II. Save:保存
III. Rdbcompression:对于存储到磁盘中的快照,可设置是否进行压缩存储,如果是的话,redis会采用LZF算法进行压缩
IV. Rdbchecksum:在存储快照后,检查校验
Security:密码设置 auth+密码
Limits:
Maxclients:最大连接数
Maxmemory:最大存储空间
缓存过期策略:
Volatile-Lru:使用LRU算法移除key,只对设置了过期时间的key
Allkeys-lru:使用Lru算法移除key;
Volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键;
Allkeys-random:移除随机的key;
Volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key;
Noeviction:不进行移除,针对写操作,只是返回错误信息;
Maxmemory—policy:
Maxmemory-samples
常见配置:
1. redis不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
2. 当redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
Pidfile/var/run/redis.pid
3. 指定redis监听端口
Port 6379
4. 绑定的主机地址
Bind 127.0.0.1
5. 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 timeout 300;
6. 指定日志记录级别 debug、verbose、notice、warning 默认为verbose
7. 日志记录方式,默认为标准输出,如果配置redis为守护进程方式运行,而这里有配置为日志记录方式为标准输出,则日志将会发送给/dev/null
8. 设置数据库的数量,默认数据库为0号库,
Databases 16
9. 制定在多长时间内,有多少次更新操作,就将数据同步到数据文件中,可以多个条件配合 save<seconds><changes>
Save 900 1
Save 300 1
Save 60 10000
10. 指定存储至本地数据库是否为压缩数据,默认为yes,
Rdbcompression yes
11. 指定本地数据库文件名,默认为dump.rdb
12. 指定那个本地数据库存放目录
13. 设置当本机为slave服务时,设置master服务的Ip地址及端口,在redis启动时,它会自动从master进行数据同步;
14. 当master服务设置了密码保护时,slave服务连接master的密码
masterauth<master-password>
15. 指定更新日志文件名,默认为appendonly.aof
Appendfilename appendonly.aof
16. 指定更新日志条件
No: 表示等操作系统进行数据缓存同步到磁盘
Always:表示每次更新操作后手动调用fsnc()j将数据写到磁盘
Everysenc:表示每秒同步一次;
Appendfsync everysec