1准备工作
启动进入到:/usr/local/bin
开启服务(指定配置文件启动):redis-server /etc/redis.conf
开启客户端:redis-cil
退出客户端:redis-cli shutdown(先退出操作界面:exit)
查看进程:ps -ef|grep redis
特点:单线程+多路IO复用
2命令
命令 | 说明 |
---|---|
set key value | 设置键值 |
setnx key value | 只有在key不存在的时候才设置值 |
mset key value key value … | 设置多个key value值 |
msetnx key value key value … | 设置多个key value值,一个存在,则全部set失败 |
setrange key 位置 值 | 给指定位置插入值 |
setex key 过期时间 value | 加入过期时间的set值 |
getset key value | 以新换旧,设置新值的同时获得旧值 |
get key | 获得对应key 的 value |
getrange key 起始位置 结束位置 | 起始0,或者value的范围值 |
mget key key | 获得多个value值 |
append key value | 追加指定的value 到 key 末尾 |
keys | 查询库中所以的key |
exists key | 存在key?存在1 不存在0 |
type key | key 的 类型 |
setnx key value | 获得值得长度 |
del key | 删除指定的key数据 |
unlink key | 非阻塞删除,后台进行异步删除 |
expire key 10 | 10s后过期 |
ttl key | 查看还有多少s过期,-1永不过期,-2已过 |
incr key | 让该key对应得数字值value+1 |
decr key | 让该key对应得数字值value+1 |
incrby/decrby key 步长 | 让该key应得数字值value增减指定的步长 |
select 0-15 | 选择0-15的一个库 |
dbsize | 查看当前库的key数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |
String 类型是二进制安全的意味着Redis的string可以包含任何数据,比如jpg图片,或者序列化的对象,最多可以是512M
List列表
lpush/rpush key value value | 从左边/右边插入一个或多个值 |
**lpop/rpop key ** | 从左边/右边吐出一个值.值在键在,值光键亡 |
rpoplpush key1 key2 | k1列表右边吐出一个值放到k2列表的左边 |
lrange key start stop | 按照索引下标获得元素(左到右)0 -1表示获取所有 |
lindex key index | 获得指定索引的value(左到右) |
llen key | 获得列表长度 |
linsert key before value newvalue | 在value的后面插入新的value值 |
lrem key n value | 从左边删除n个value(左到右) |
lset key index value | 将指定索引的值替换成value |
set集合
Set 数据结构是dict字典,字典是用hash表实现的.通过hash表快速查询
sadd key value1 value2 … | 添加值(已经存在的member元素会被忽略) |
smembers key | 取出集合中的所有值 |
sismember key value | 判断集合key中是否含有该value值 |
scard key | 返回该集合元素个数 |
srem key value1 value2 … | 删除集合中的某个元素 |
spop key | 随机从集合中吐出一个值 |
srandmember key n | 随机从该集合中取出n个值 |
smove key1 key2 value | 把key1集合中的一个值从一个集合移动到key2集合 |
sinter key1 key2 | 返回俩个集合的交集 |
sunion key1 key2 | 返回俩个集合的并集 |
sdiff key1 key2 | 返回俩个集合的差集元素(key1中的,不包含key2中的) |
hash集合
hset key field value | 给key集合的field 赋值value |
hmset key field1 value1 field2 value2 … | 给key集合赋多个值 |
hget key field | 在key集合中取出指定field的值 |
hexists key field | 判断存在 |
hkeys key | 列出该hash集合的所有field |
hvals key | 列出该hash集合的所有fvalue |
hincrby key field increment | 为hash表key中的域field的值加上增量1 -1 |
hsetnx key field value | 将hash表key中的域field的值设置为value,当且仅当域field不存在 |
Zset有序集合
没有重复元素,集合的成员是唯一的,但是评分是可以重复的
zadd key score1 value1 score2 value2 | 添加值,给定评分 |
zrange key start stop [withscores] | 查看指定范围[带评分显示] |
zrangebyscore key min max [withscores] [limit offset count] | 查看min<=score<=max的value |
zrevrangebyscore key min max | 同上,从大到小排序 |
zincrby key increment value | 为元素的score加上增亮 |
zrem key value | 删除该集合下,指定值的元素 |
zcount key min max | 统计该集合,分数区间内的元素个数 |
zrank key value | 返回该值在集合中的排名,从0开始 |
3redis6新增数据类型
3.1HyperLogLog
面对基数问题,如:求集合不重复元素个数,独立访客数等,相比set等集合,节省了非常非常非常多的空间
pfadd key value1 value2 | 添加操作 |
pfcount key | 查看数量 |
pfmerge newkey oldkey1 oldkey2 | 将一个或多个HLL合并后的结果存储在另一个HLL中 |
3.2GEO
GEO,Geographic,地理信息的缩写,元素的2维坐标,在地图上就是经纬度,有效经度在-180到180,有效纬度在-85.05112878到85.05112878,超出报错,
已经添加的数据无法再次添加
例如 | ||
---|---|---|
geoadd key 经度 纬度 name | 添加 | geoadd china:city 121.47 31.23 shanghai |
geopos key name | 获得 | geopos china:city shanghai |
geodist key1 name1 name2 单位 | 获得俩个地方的直线距离 | geodist china:city shanghai beijing km |
georadius key 经度 纬度 距离 | 获得指定以指定经纬度为中心,获得指定范围内的城市 | georadius china:city 110 30 1000km |
4事务
命令队列,串联命令
1.从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,知道输入Exec后,Redis会将之前的命令队列中的命令依次执行
2(区别mysql).在组队阶段出现语法错误,执行exec命令后整个事务报错
在执行阶段出现的错误,只会影响对应命令的执行,其他命令正常执行
3.乐观锁实现事务!使用版本号机制,对数据绑定版本,修改数据后对应修改版本,在用户操作数据时会确认用户取到的key值版本与当前数据库key值版本是否一致,一致则事务执行成功,反之!
multi | 开启事务队列 |
exec | 执行事务队列 |
discard | 取消事务队列 |
watch key1 key2 | 监视key:在执行multi之前,先执行watch key,可以监视指定的key,如果事务执行之前,这个key被其他命令所改动,那么事务被打断(乐观锁) |
unwatch | 取消监视 |
4.1事务三特性
1.单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行.事务在执行的过程中,不会被其他客户端发来的命令请求所打断.
2.没有隔离级别的概念:队列中的命令没有提交之前都不会被实际执行,因为事务提交前任何指令都不会被实际执行
3.不保证原子性:事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚.
5主从复制
一台主机,多台从机
主机可以进行读写操作
从机只能进行读操作
若主机宕机,重启之后主机依然是关联之前的从机,数据信息恢复
若从机宕机,重启之后所以信息清空,失去主从关系,需要重新确立主从关系,并且复制主机的数据
薪火相传:从机可以成为其他从机的从机,也就是master->slave->slave->…
而不止是master一下拥有一堆slave,这样可以减轻主机的管理压力,但是相应的,如果其中一台slave宕机,则会影响后面slave的数据.
命令 | 说明 |
---|---|
info replication | 打印主从复制的相关信息 |
slaveof ip port | 成为某个实例的从服务器 |
slaveof no one | 将该从机变为主机(反客为主) |
5.1哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库.
如何启用?
1
新建sentinel.conf 文件,内容为:
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称(别名), 1 为至少有多少个哨兵同意迁移的数量(至少有1个哨兵响应了,就可以执行反客为主).
2
/usr/local/bin
redis做压测可以用自带的redis-benchmark工具
执行redis-sentinel sentinel.conf
怎么确定哪台从机反客成主机master?
1.先根据优先级别,启动服务的配置文件中优先级的:replica-priority 100
值越小优先级越高
2.偏移量:指获得原主机数据最全的.
3.runid:每个实例启动后都会随机生成一个40位的runid
集群
什么是集群?
集合群体,即用多个redis节点分摊单个节点的压力,
我们启动N个节点组成集群,那么我们数据就会分布存储在这N个节点中,每个节点存储1/N的数据量.
redis的每个节点都分布着均分的插槽(slot)数量,当我们存入数据时(set等操作),会生成插槽值,根据该插槽值将数据存放到对应的节点!
如何创建集群?
配置文件修改指定参数
daemonize yes 开启守护进程
cluster-enabled yes 打开集群模式
cluster-config-file nodes.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间(毫秒),节点自动进行主从切换
进入 /opt/redis-x.x.x/src 目录,输入命令
redis-cli --cluster create --cluster-replicas 1 IP:端口 IP:prot IP:prot IP:prot IP:prot IP:prot
1,代表的是一台主机对应一台从机
命令
redis-cli -c -p 6379 | -c采用集群策略连接 |
cluster nodes | 查看集群信息 |
cluster getkeysinslot | 返回count个solt槽中的键 |
不在一个solt下的键值,是不能使用mget,mset等多建操作的.
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去
说明
如果某一段插槽的主从都挂掉,而配置文件中的
cluster-require-full-coverage为yes,那么整个集群都会挂掉,反之.
也遵循反客为主,对于相同插槽的主从机!