Redis篇

----------------------------------------------------------------------------------------------------------------
默认端口:6379
----------------------------------------------------------------------------------------------------------------
前端启动:/usr/local/redis/bin/redis-server
对应关闭:Ctrl+c 或 /usr/local/redis/bin/redis-cli shutdown
后端启动:/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf(将redis.conf中daemonize由no改为yes)
对应关闭:杀进程 或 /usr/local/redis/bin/redis-cli shutdown
----------------------------------------------------------------------------------------------------------------
5种数据类型:字符串(String)、集合(Set)、有序集合(SortedSet即zset)、列表(List,是双向链表)、哈希或散列(Hash)
注意无序、不重复的用Set
----------------------------------------------------------------------------------------------------------------
应用场景:快速读写,只需要key获取值的,MongoDB就可以根据参数json串查询,做聚合、MapReduce分布式聚合等
评论:list类型,key是主题\商品id,很多value是评论的内容,一个value是一个评论,空格相隔分开
rpush 000001 用户1评论:不错 用户2评论:哈哈,终于买到合适的了 用户3评论:物美价廉
点赞:点击一次key自增1,或者存放字符串类型的json,{id,点赞数},这样前端解析方便
接口幂等性:字符串类型,调用业务接口前一步先存token到redis,执行具体业务方法前先判断redis中是否有token,
有的话删掉执行后面的逻辑,没有的话(已经删过了)不是幂等的,提示已执行。
单机登陆:存放session,SpringBoot集成了Spring-Session就提供了这个方案
生成数据库表的id:字符串类型,对于分布式数据库,插入表前先获取唯一id,利用redis自增命令incr,返回自增后的id
存放商品信息:哈希类型,好处,可以根据key的字段修改值,用String类型的话,需要修改解析json。
key相当于java类的实例,field相当于java类的字段名,value相当于java类字段的值。
比如:hset studentShenlei name sl
hset studentShenlei age 22
hset studentShenlei address qingdao
理解为两个key得了。。。一个是studentShenlei 一个是address,这种数据结构都可以用哈希
排行情况:商品销售排行榜,score是销售量,value是商品id
----------------------------------------------------------------------------------------------------------------
相关命令:
查询所有key:keys *
删除所有key:flushall
lpush 记住反着来的,先push的坐标大,数从右往左进入<-数
lpush a 1 2 3 4 5
lindex a 0 取出5
lindex a 1 取出4
lpop a 删掉并返回最左边的,此时是5
lpop a 删掉并返回最左边的,此时是4
rpush b 1 2 3 4 5
lindex b 0 取出1(没有rindex命令)
lindex b 1 取出2
rpop b 删除并返回最右边的,此时是5
rpop b 删除并返回最右边的,此时是4
lset 000001 0 用户1评论:货物不好(将第一条评论修改为货物不好)
rpush 000001 数据1 数据2 数据3 数据4 数据5
lrem 000001 1 数据3(1代表删除前1个,根据value删除,感觉不好,删除后,下标为4的没有了,下标为0 1 2 3了)
关于列表的push,最好是rpush写入;rpop相当于栈,后进先出;lindex坐标左边最小
新增命令:set key value
mset key1 value1 key2 value2
hset key field value
hmset key field1 value1 field2 value2
lpush key value1 value2 value3
rpush key value1 value2 value3
sadd key value1 value2 value3
zadd key score value score2 value2 score3 value3
查询命令:get key
getset key value(获取旧值,设置新值)
mget key key2 key3
hget key field
hmget key field1 field2 field3
lindex key index
smembers key(查询集合中所有元素)
sismember key value(元素是否在集合中)
zscore key value(获取元素分数)
zrange key 开始下标 结束下标(查询下标之间的元素,分数由小到大)
zrange key 开始下标 结束下标 withscores(查询下标之间的元素和分数,分数由小到大)
修改命令:set、mset、hset、hmset与新增一致,替换掉旧的
lset key 下标 newValue
删除命令:del key
rpop/lpop key(返回并删除)
flushall(删除redis中的所有的)
lrem key count value(删除前count个,值为value的数据)
srem key value value2 value3
zrem key value
hdel key field(删除哈希的某个字段)
----------------------------------------------------------------------------------------------------------------
两种持久化方式:RDB(默认)、AOF
RDB:快照方式,符合一定条件时,内存数据持久化到硬盘,如15分钟内一个键被修改,5分钟10个键被修改等。默认有3个配置。
1G文件载入内存需要20-30秒。redis.conf配置持久化文件路径,后缀rbd。
AOF:配置文件redis.conf的appendonly参数开启。配置持久化文件路径,后缀aof。执行一条就写入硬盘,不会丢失数据。
----------------------------------------------------------------------------------------------------------------
主从模式:
一主能对应多从,但是一从只有一个主;主从实时同步;主从复制时,master可以继续处理client,不会阻塞
一个redis可以是某个主机的从机,同时又是其他从机的主机;
从机不能写数据,主机宕机,从机也可以读;从机宕机,主机可以读写,并且从机启动后能读到新的数据
主机宕机解决方案:从机执行./bin/redis-cli -p 6380 slaveof NO ONE(从机变为主机,具有写权限)
宕掉的主机修复后,先用从机的持久化文件覆盖它的,启动修复的原主机
从机执行./bin/redis-cli -p 6380 slaveof 192.168.1.100 6379设置为从机
设置完成,且数据已同步,从机没有写的权限
从机宕机解决方案:重启从机,数据自动同步,自动恢复为从机。
主从配置步骤:
主机不用配置,从机修改redis.conf,如slaveof 192.168.43.151 6379
清除从机的持久化文件,rm -rf appendonly.aof dump.rdb(防止之前的数据没有同步)
----------------------------------------------------------------------------------------------------------------
哨兵模式:
主从模式出现故障时需要手动完成主从切换,哨兵可以自动完成切换,哨兵本身不存储数据
一般主从配合哨兵模式使用(本来哨兵模式不能单独使用,redis分为单机、主从(主从+哨兵)、集群)
哨兵模式作用:监控主、从数据库是否正常运行;主数据库出现故障时,自动将从数据库切换为主数据库
多哨兵模式:单个哨兵可能出现故障,推荐多哨兵,哨兵互相监控主从,哨兵之间也互相监控
哨兵实现原理:哨兵进程启动时读取配置文件,找出需要监控的主数据库(从节点可以通过主节点获得)
#一个哨兵可以监控多个主节点,不建议这样,因为哨兵崩溃时,集群切换容易发生故障
哨兵每隔几秒发命令,如果超时,认为主观下线,如果是主数据库,会给其它哨兵发送命令
如果达到一定数量的哨兵认为它下线了,那它就是客观下线。
主节点客观下线时,需要自动主从切换,过程:
选一个从库,给它发slave no one命令升级为主库;发送slaveof命令将其它从库的主库设置为新的主库信息
旧的主恢复了,变成从
----------------------------------------------------------------------------------------------------------------
集群模式:所有节点都是主节点
redis节点之间通过ping-pong机制互联
判断某master宕掉:投票。半数master连接它都超时,认为宕掉了
判断集群宕掉:即集群状态为fail。任意master宕掉,并且它没有slave节点。或者 超过半数master节点宕掉
主节点宕掉,它的从节点顶上来成为主节点,宕掉的主节点重启后变为从节点
客户端与redis节点直连,不需要代理层,客户端连接任意一个节点即可
集群存储数据:
集群把所有物理节点映射到[0-16383],共16384个哈希槽上。当存储一个key-value时,将key使用某算法,算出一个结果对16384取余,
这样key会对应一个0-16383之间的哈希槽,redis大致平均的存储在每个节点
安装:
安装ruby、rubygems(ruby和redis的接口程序,生成redis-trib.rb)
将集群中节点的redis.conf中cluster-enabled设置为yes
全部启动所有节点
创建集群:redis-trib.rb create --replicas 1 192.168.7.151:7001 192.168.7.151:7002
192.168.7.151:7003 192.168.7.151:7004 192.168.7.151:7005 192.168.7.151:7006
指定master和副本,1代表1个副本,7001的副本时候7004,依次类推
集群管理:
集群查看:查看集群基本信息和节点信息:cluster info(集群状态ok,fail)、cluster nodes(ip、端口,master或者slave)
集群连接:连接上集群的任一节点即可,无论主从,如 ./7001/redis-cli -h 192.168.7.151 -p 7001 -c
集群关闭:正常关闭每一个节点,杀进程或redis-cli shutdown
集群重启:先停掉每一个节点,再依次启动每一个节点
集群重建:删除每一个节点的持久化文件,重新启动节点,执行redis-trib.rb create命令(如上创建集群)
添加主节点:./redis-trib.rb add-node 192.168.7.151:7007 192.168.7.151:7001(添加节点7007,7001是任意一个节点)
./redis-trib.rb reshard 192.168.7.151:7001(reshard分配哈希槽,分配了才能存储数据)
需要填写哈希槽数量、接收节点id、源节点id(槽来自于的节点,一般输入all)
添加从节点:./redis-trib.rb add-node --slave --master-id cbbce4b5255d81cbbfdb56203091580333df7853
192.168.7.151:7008 192.168.7.151:7001(多了个--slave --master-id cbbce4b5255d81cbbfdb56203091580333df7853)
删除节点:./redis-trib.rb del-node 192.168.7.151:7008 2763319a9dd00773c928c9f3c5ebfd2057dbae15(后面是删除节点的id)
节点中有数据不能删除,否则删除报错。
----------------------------------------------------------------------------------------------------------------
java客户端:jedis中java的api名称与redis客户端的api一致。set、get、sadd等
单机连接:Jedis jedis=new Jedis("192.168.7.151",6379);
jedis.select(2);//选择数据库
jedis.set("jediskey", "哈哈哈哈");
jedis.get("jediskey");
JedisPool pool=new JedisPool("192.168.7.151",6379);//使用连接池
Jedis jedis=pool.getResource();后面一样
集群连接:Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.7.151", 7001));
nodes.add(new HostAndPort("192.168.7.151", 7002));
nodes.add(new HostAndPort("192.168.7.151", 7003));
JedisCluster cluster = new JedisCluster(nodes);//使用JedisCluster对象
cluster.set("cluster-test", "my jedis cluster test");
cluster.get("cluster-test");
Spring中xml配置:配置一个JedisPoolConfig的bean(最大连接、最小连接、超时等),注入到JedisPool的bean(设置地址、端口)中
或者注入到JedisCluster的bean(设置多个地址、端口)中
----------------------------------------------------------------------------------------------------------------

posted @ 2024-05-23 10:45  雷雨客  阅读(5)  评论(0编辑  收藏  举报