Redis中的一致性hash算法
一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义。
环形Hash空间
在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。
如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。
按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。如下图
存储的数据要散列均匀
在一致性哈希算法中,为了尽可能的满足平衡性,其引入了虚拟节点
虚拟节点”( virtual node )是实际节点(机器)在 hash 空间的复制品( replica ),一实际个节点(机器)对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以hash值排列
“虚拟节点”的hash计算可以采用对应节点的IP地址加数字后缀的方式。例如假设NODE1的IP地址为192.168.1.100。引入“虚拟节点”前,计算 cache A 的 hash 值:
Hash(“192.168.1.100”);
引入“虚拟节点”后,计算“虚拟节”点NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2
1.字符类型
一个字符类型的key默认存储的最大容量是512M 。
赋值:SET key value
取值: GET key
递增数字: incr key
原子性操作(线程安全的操作)
递增指定的整数:incrby key increment
原子递减:decr key
向指定的key追加字符串:append key value
获得key对应的value的长度:strlen key
同时获得多个key的value:mget key key..
同时设置多个key的值:mset key value key value key value …
setnx(set not exist 的缩写):就是只有不存在的时候才设置,可以用它做一个redis的分布式锁
2.散列类型
hash key value 不支持数据类型的嵌套
比较适合存储对象
person
age 18
sex 男
name jack
hset key field value
hget key filed
hmset key filed value [filed value …] 一次性设置多个值
hmget key field field … 一次性获得多个值
hgetall key 获得hash的所有信息,包括key和value
hexists key field 判断字段是否存在。 存在返回1. 不存在返回0
hincrby
hsetnx
hdel key field [field …] 删除一个或者多个字段
3.列表类型
list, 可以存储一个有序可重复的字符串列表
LPUSH/RPUSH: 从左边或者右边push数据
LPUSH/RPUSH key value value …
{17 20 19 18 16}
llen num : 获得列表的长度
lrange key start stop : 索引可以是负数, -1表示最右边的第一个元素
lrem key count value :count代表需要删除几个value
lset key index value :将列表 key 下标为 index 的元素的值设置为 value
LPOP/RPOP :取数据
应用场景:可以用来做分布式消息队列
4.集合类型
set 跟list 不一样的点。 集合类型不能存在重复的数据。而且是无序的
sadd key member [member ...] 增加数据; 如果value已经存在,则会忽略存在的值,并且返回成功加入的元素的数量
srem key member 删除元素
smembers key 获得所有数据
sdiff key key … 对多个集合执行差集运算
sunion 对多个集合执行并集操作, 同时存在在两个集合里的所有值
5.有序集合
Zadd key score member :将一个或多个 member
元素及其 score
值加入到有序集 key
当中
zrange key start stop [withscores] 去获得元素 withscores是可以获得元素的分数
如果两个元素的score是相同的话,那么根据(0<9方式从小到大
1.数据缓存(商品数据、新闻、热点数据、过程数据)
2.单点登录
3.秒杀、抢购
4.网站访问排名…
5.应用的模块开发
1.下载redis安装包
2.wget http://download.redis.io/releases/redis-4.0.11.tar.gz
3.tar -zxvf 安装包
4.在redis目录下 执行 make
5.可以通过make test测试编译状态
6.make install [prefix=/path]完成安装
启动停止redis: ./redis-server ../redis.conf
停止redis: ./redis-cli shutdown
以后台进程的方式启动,修改 redis.conf daemonize =yes
连接到redis的命令: ./redis-cli -h 127.0.0.1 -p 6379
Redis-server 启动服务
Redis-cli 访问到redis的控制台
redis-benchmark 性能测试的工具
redis-check-aof aof文件进行检测的工具
redis-check-dump rdb文件检查工具
redis-sentinel sentinel 哨兵高可用方案