We first need to introduce nosql database:
1没有声明性的查询语言
2没有预定义的模式
3最终一致性 而非ACID属性
4非结构化和不可预知的数据
5CAP定理 三选二 不可能全满足
6高性能,高可用性和可伸缩性
**
The basic operation of key
**
redis默认有16个数据库:
CONFIG GET databases; 获取某个配置项的值
DBSIZE 获取当前数据库里面有多少个数据
select 进行切换数据库
●KEYS 匹配表达式 可以把相匹配的key查找出来 *表示很多字符 ?表示一个任意字符
●TYPE KEY 返回某一个键对应的值的类型
●MOVE KEY DB 把键值对移到某个数据库中
●DEL 多个KEY 根据KEY进行删除 返回成功删除的个数
●EXISTS 多个KEY 返回存在的KEY的数量
●RANDOMKEY 在现有的KEY中随机返回一个
●RENAME KEY NEWKEY 重命名,会导致覆盖
●RENAMENX KEY NEWKEY 重命名,不允许覆盖
●TIME 返回当前UNIX时间戳
●TTL KEY 查看存活时间 (秒 -1就是永久)
●PTTL KEY 查看存活时间 (毫秒)
●EXPIRE KEY SECONDS 设置过期时间
●EXPIREAT KEY TIMESTAMP 设置一个KEY在TIMESTAMP指定的时间过期
●PEXPIRE KEY MILLISECONDS 以毫秒为单位指定过期时间
●PERSIST KEY 设置为永久的key
**
value operations
**
首先知道redis的value有五大数据类型
(1)string类型
(2)list类型
(3)hash类型
(4)set类型
(5)zest类型
(1)string类型 是二进制安全的 可以包含任何数据
●SET KEY VALUE [EX SECONDS] [PX MILLISECONDS] [NX|XX]
存活秒数 毫秒数 key不存在才行|key存在才行
●GET KEY 获取String类型的value
●APPEND KEY VALUE 在key对应的value后面追加值,返回值是追加后字符串长度
●STRLEN KEY 字符串长度
●INCR KEY +1
●DECR KEY -1
●INCRBY KEY INCREMENT 原值+INCREMENT
●DECRBY KEY DECREMENT 原值-DECREMENT
●GETRANGE KEY START END 从字符串中取指定的一段
●SETRANGE KEY OFFSET VALUE 替换字符串中的一段值
●SETEX KEY SECONDS VALUE 跟ex参数一样
●SETNX KEY VALUE 跟nx参数一样
●MSET KEY VALUE [KEY VALUE ...] 一次性设置多个键值对
●MGET KEY [KEY ...] 一次性指定多个KEY,返回它们对应的值,没有值的返回nil
●MSETNX KEY VALUE [KEY VALUE ...] 一次性新建多个值
●GETSET KEY VALUE 设置新值,同时将旧值返回
(2)list类型 是两端都可以压入弹出的结构 所以头尾效率高,中间效率低
●LPUSH key value [value ...]
●RPUSH key value [value ...]
●LRANGE key start stop
根据list集合的索引打印元素数据 0 -1可以打印全部
正着数:0 1 2 3 4 5 。。。
倒着数:。。。-5 -4 -3 -2 -1
●LLEN key 返回list的总长度
●LPOP key 弹出左边的元素并且从list中删除
●RPOP key 弹出右边的元素并且从list中删除
●RPOPLPUSH source destination 从source中RPOP一个元素,LPUSH到destination中
●LINDEX key index 根据索引从集合中取值
●LINSERT key BEFORE|AFTER pivot value 在list中插入value 位置放在pivot的前面或者后面
●LPUSHX key value 只能针对存在的list执行LPUSH
●LREM key count value 删除左边count个元素
●LSET key index value 替换元素
●LTRIM key start stop 仅保留指定区间的数据,两边的数据被删除
(3)set类型 (就相当于在一个集合中放进去值 没有顺序)
●SADD key member [member ...] 放进一个键值对
●SMEMBERS key 查看value
●SCARD key 返回集合中元素的数量
●SISMEMBER key member 检查当前指定member是否是集合中的元素 是返回1 不是返回0
●SREM key member [member ...] 根据key删除集合中的元素
●SINTER key [key ...] 返回两个集合中交集的部分
●SINTERSTORE destination key [key ...]
取交集后存入destination
●SDIFF key [key ...] 返回集合1减去集合2的的部分
●SUNION key [key ...] 返回并集
●SDIFFSTORE destination key [key ...] 保存到destination中
●SUNIONSTORE destination key [key ...] 保存到destination中
●SMOVE source destination member 把member从source移动到destination
●SPOP key [count] 从集合中随机弹出count个数量的元素,count不指定就弹出1个 弹出完就没了
●SRANDMEMBER key [count] 从集合中随机返回count个数量的元素,count不指定就返回1个 弹出的话原本元素还在里面
●SSCAN key cursor [MATCH pattern] [COUNT count] 基于游标的遍历 0表示结束
(4)HASH 键值对 值又是键值对
●HSET key field value 设置键值对
●HGETALL key 返回全部
●HGET key field 返回一个
●HLEN key 返回长度
●HKEYS key 返回hash中的所有键
●HVALS key 返回hash中的所有值
●HEXISTS key field 判断hash中的键是否存在
●HDEL key field [field ...] 删除对应的键值对
●HINCRBY key field increment 加上
●HMGET key field [field ...] 一次性获取多个值
●HMSET key field value [field value ...] 一次性设置多个值
●HSETNX key field value 要求hash中的键是新建的
●HSCAN key cursor [MATCH pattern] [COUNT count] 基于游标对hash进行遍历
(5)zset 键值对 值是数字 最后按照数字进行排队
●ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 增加键值对
●ZRANGE key start stop [WITHSCORES] 返回这个区间的值
●ZCARD key 返回集合中元素的数量
●ZCOUNT key min max 查找在min,max之间的元素
●ZSCORE key member 获取对应的数字
●ZINCRBY key increment member 加一个数
●ZLEXCOUNT key min max
●ZRANGEBYLEX key min max [LIMIT offset count]
按照字母顺序在区间内返回member 所以填的是字母
min和max使用“[a”表示闭区间,使用“(a”表示开区间
-表示负无穷
+表示正无穷
●ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
在分数的指定区间内返回数据
●ZRANK key member 返回分数对应的排名
●ZREM key member [member ...]
●ZREMRANGEBYLEX key min max
●ZREMRANGEBYRANK key start stop
●ZREMRANGEBYSCORE key min max
●ZREVRANGE key start stop [WITHSCORES]
●ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
●ZREVRANK key member
●ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
●ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
把指定集合的member取交集,分数会相加
●ZSCAN key cursor [MATCH pattern] [COUNT count]
**
redis configuration information presentation
You can start the cluster according to multiple profiles start
**
redis的配置文件:
includes :可以用include包含其他的配置文件 用在你将配置文件分成多个的情况下
bind 绑定的ip才可以访问redis 一般注释掉 然后配置密码
port 监听的端口号
timeout 超时时间 0表示没生效
daemonize yes 后台运行
pidfile 存放进程id 这个值会经常性改变的 跟端口号不一样
loglevel 日志级别
logfile 指定日志文件的地址 空字符串表示标准输出中打印(直接在前台打印 但是如果用的是daemonize 日志会被送到 /dev/null)
databases 16 表示有16个数据库
SNAPSHOTTING rdb持久化方式的配置地方
replication 跟主从复制有关的配置
Security 跟安全有关
requirepass 设置密码
maxclients 最大客户端的配置
APPEND ONLY MODE aof处久化方式的配置地方
**
redis persistence
及相关的配置
**
1 RDB 每隔一定的时间把内存的数据保存到硬盘上
save A秒 B次 A秒内有B次修改就保存
不可以保证数据的绝对安全,而且通常不会在redis中只有一份 mysql中也可以保存一份并且
如果redis做二级缓存(经常查询 很少修改 ,不是特别重要允许出现偶尔的并发问题,
不会被其他应用程序修改不和其他应用程序共享的),重要 完全不能丢失的数据不会放在redis中
(1)默认启动,想要禁用RDB的话就删除save
(2)持久化文件名 253 行dbfilename 配置主从集群的时候就需要改这个名字
持久化文件保存路径 263 dir ./ 表示的是你从哪个路径启动的redis 就会保存在哪里 所以一般指定一个绝对路径 /usr/local/redis
(3)BGSAVE stop-writes-on-bgsave-error yes/no no表示后台写入错误也不处理不在乎数据不一致
(4)数据压缩 rdbcompression yes 对于存储到磁盘中的快照 可以设置是否进行压缩存储 是硬盘资源和cpu资源之间的权衡
(5)rdbchecksum yes 存储快照后 还可以让redis使用CRC64算法来进行数据校验 会消耗10%的性能消耗
2 AOF 不保存数据本身 保存生成数据的命令 rdb是二进制文件不可读 AOF还有可读性
(1)默认关闭 appendonly yes 改成yes
(2)核心策略:
701 appendfsync always 每条命令都保存
702 appendfsync everysec 每秒执行一次保存(默认)
703 appendfsync no 不保存
(3)AOF重写:
文件增加到一定的大小的时候 可以进行AOF重写 把好几条命令合成一条命令
auto-aof-rewrite-percentage 100 表示文件翻了一倍的时候进行重写
auto-aof-rewrite-min-size 64mb 表示超过了64mb进行重写
(4)AOF持久化文件的修复
/usr/local/bin/redis-check-aof --fix appendonly.aof 把坏的切掉了
/usr/local/bin/redis-check-rdb --fix rdb也可以用类似命令
**
redis transaction-related commands
**
MULTI
好几个命令
EXEC
这几个命令先不执行 EXEC的时候开始一起执行 其中一个错误的话就会全部都不执行但是入队的时候没有检测到错误是不会回滚的
WATCH之后才进入事务的话:在EXEC之前如果有别人操作了 那么这一串事务作废
**
Optimistic and pessimistic locking
**
乐观锁:不锁定数据 以达到更好的性能 万一发生了碰撞 放弃自己的操作 不会导致数据的不一致
redis
悲观锁:操作钱锁定数据 避免数据的不一致
**
redis publication subscriptions
**
SUBSCRIBE 订阅频道
PUBLISH 发布
**
Master-slave replication cluster
**
配置多个配置文件 分别启动 INFO replication查看主从服务器状态
(1)默认都认为自己是master
(2)SLAVEOF 设置为另外一个master的奴隶 SLAVE no one 变成master
(3)主机可以写 从机自动同步 但是从机只能读 因为有配置slave-read-only yes
(4)从机shutdown后重新登陆会变成master 只有SLAVEOF后才能获得这期间的数据
(5)主机shutdown后从机还是slave 主机登陆后还是master
**哨兵模式**
一般哨兵会配置多个 防止判断失误
主观下线:只有一个哨兵认为下线了
客观下线:达到配置的个数的哨兵下线了就可以
(1)slave下线后会主动变成slave
(2)主机下线后会在从机中选取主机 主机回来后就是slave
**
jedis
Notes bind password requirepass
**
jedis直接连接:
new Jedis();
jedis.auth();
jedis.ping();
jedis.close();
连接池:
new GenericObjectPoolConfig() new Jedispool() getResource() 都得关闭