Redis是一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存、消息中间件。 它支持多种数据结构,如字符串、散列(hash)、列表(list)、集合(set)、有序集合(sort set);与范围查询、bitmaps、hyperloglogs、地理空间、索引半径查询。 redis内置了副本(Replication)、事务(Transaction)、和不同级别的磁盘持久化(Persistence)、并通过哨兵机制、Cluster集群提供高可用性。
知识点
想要玩转redis,我们需要知道哪些知识点呢? redis配置,默认,非默认,集群,多实例,连接池参数等 redis读写操作,RedisTemplate的基本使用。 几种序列化方式对比
RedisTemplate
RedisTemplate 封装了 RedisConnection,具有连接管理,序列化和 Redis 操作等功能。 几种序列化方式对比
挖矿病毒
挖矿病毒,利用Redis的未授权访问漏洞进行攻击。Redis 默认配置为6379端口无密码访问,如果redis以root用户启动,攻击者可以通过公网直接链接redis,向root账户写入SSH公钥文件,以此获取服务器权限注入病毒
高可用
redis集群是由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。
节点之间相互连接,关系平等、去中心化,每个节点都有分片处理功能。这样就可以很好的保证redis的高可用性。 Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。这样就可以很好的保证redis的高可用性。
数据结构
Redis可以存储键与5种不同数据结构类型之间的映射,分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。 缓存:缓存的目的是快速读取与写入。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
说明: 1)Redis不支持自定义数据库名 2)Redis不支持为每个数据库设置密码 3)Redis的多个数据库之间不是完全隔离的,FLUSHALL命令会清空所有数据库的数据 a)FLUSHALL – 清空所有数据库的所有数据 b)FLUSHDB – 清空当前所在数据库的数据
安装与编译
如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis /etc/init.d/redis-server stop /etc/init.d/redis-server start /etc/init.d/redis-server restart
如果是通过源码安装的redis,则可以通过redis的客户端程序redis-cli的shutdown命令来重启redis
1.redis关闭 redis-cli -h 127.0.0.1 -p 6379 shutdown
2.redis启动 redis-server
3.如果上述方式都没有成功停止redis,使用终极武器 kill -9
1、解压Redis tar xzvf /usr/redis/redis-4.0.9.tar.gz -C /usr/redis/ 2、编译及安装 [root@localhost redis]# cd /usr/redis [root@localhost redis]# make && make install
3、关闭Redis服务 pkill redis-server killall redis-server
redis配置文件
3、创建文件夹run、logs、dbcache mkdir -p /usr/redis/redis-6379/{run,conf,logs,dbcache} #配置文件修改(略) /usr/redis/redis-6379/conf/redis.conf
4、启动Redis服务,使用redis.conf /usr/redis/src/redis-server /usr/redis/redis-6379/conf/redis.conf
启动redis
find ./700* | egrep “.(conf)” | awk ‘{system("./src/redis-server "$1)}’
等价于 分别执行 ./src/redis-server ./7001/redis-7001.conf
批量停止 ps -ef|grep redis|grep -v grep| awk ‘{system("kill -9 "$2)}’
命令
FLUSHALL – 清空所有数据库的所有数据(不起作用) FLUSHDB – 清空当前所在数据库的数据
keys * 查询所有键
set get 字符串命令
set name zhangsan #set设置的两个数据的key内容是相同的,则默认覆盖
SETEX [SETEX key seconds value] 安全 setex login 10 zhangsan 设置张三登录有效时间为10秒
ttl key 查询剩余有效时间,过期返回-2 persist key 修改有效期为永久时间,返回-1 MSET KEY1 VALUE1 KEY2 VALUE2 KEY3 VALUE3 设置多个key mset username1 zhangsan username2 lisi username3 wangwu
msetnx [msetnx]不覆盖设置多个key,成功返回1,若存在重复则添加失败返回0 msetnx username zhangsan1 #返回1 msetnx username zhangsan2 username2 lisi username3 wangwu #返回0
append append key value 追加内容
set username hello append username world
del key key key删除指定内容,返回2(指定key不存在,不会影响删除操作)
HASH
hset dept id 1001 返回(integer) 0 true
hget dept id
hkeys dept * 获取dept所有hash key
hsetnx dept id 1002 返回0(false)
hsetnx dept id2 1002 返回1(true)
hmset dept id 1001 name 销售部 level 1
hlen 元素个数
hexists dept id 判断是否存在
hdel KEY VALUE1 VALUE2 删除
hkeys dept * 获取dept所有hash key
HVALS key 获取哈希表中所有值
127.0.0.1:6379> hvals dept
1) ""1003""
2) ""\xe9\x94\x80\xe5\x94\xae\xe9\x83\xa8"" #销售部
3) ""2""
"hgetall dept #获取所有KEY VALUE
127.0.0.1:6379> hgetall dept
1) ""id""
2) ""1003""
3) ""name""
4) ""\xe9\x94\x80\xe5\x94\xae\xe9\x83\xa8""
5) ""level""
6) ""2""
数字操作
set numberid 1 设置普通数据id hset dept id 1 设置HASH数据id incr numberid #自增1,结果=2 decr numberid #自减1 incrby numberid 5 #自增指定数量5,结果7 decrby numberid 5 #自减指定数量5,结果7-5 hincrby dept id 1 哈希数据类型自增 hincrby dept id -1 哈希数据类型自减
List集合
lpush lpush KEY VALUE #向栈中压入数据(push属于入栈,栈的特点是先进后出) lpush book yuwen shuxue computer[java,oracle,redis]
rpush rpush 栈底入栈(right push) rpush book English 从尾部保存元素(栈底入栈)
lrange 取得指定索引位置的值:lrange 集合KEY startIndex endIndex lrange book 0 5 lrange book 0 -1 #取得所有
llen llen key #查询数量
linsert 在元素前追加内容 格式:linsert 集合KEY BEFORE|AFTER VALUE NEWVALUE
127.0.0.1:6379> linsert book BEFORE yuwen springboot
127.0.0.1:6379> lrange book 0 -1
1) computer[java,spring,oracle,redis]
2) shuxue
3) springboot
4) yuwen
127.0.0.1:6379> linsert book after yuwen springcloud
(integer) 5
127.0.0.1:6379> lrange book 0 -1
1) computer[java,spring,oracle,redis]
2) shuxue
3) springboot
4) yuwen
5) springcloud
注:当list集合有重复数据,则linsert插入默认栈顶向下第一个数据为准
lset 修改指定索引的内容 lset book 3 语文 lset book 3 yuwen
lrem 删除 lrem key COUNT VALUE
lrem book 1 yuwen 删除1个语文 lrem book 3 yuwen 删除重复3个的语文
ltrim 删除范围外数据(保留指定范围内的数据) 格式:ltrim KEY startIndex endIndex ltrim book 0 9 lpop rpop 从集合的头部删除元素,并返回删除元素(栈顶元素出栈) rpop book(栈底元素出栈) lpop book
rpoplpush 将移除的元素添加到指定的集合中 lindex KEY index 取得元素的索引的内容 lindex book 2 #springboot
Set集合类型(无序)
sadd letter a b c d e; //添加set集合及元素 smembers letter;
srem 集合key 元素 //删除set集合元素 srem letter e; //删除字母e spop letter //栈顶元素出栈 sdiff key1 key2 //返回两个集合的差集 sdiffstore //将差集保存到新的集合中 sinter 集合key1 key2交集计算 sinterstore //将交集保存到新的集合中 sunion key1 key2 //将两个集合合并 sunionstore key1 key2 //将并集结果存储 scard key //返回集合个数 sismember key value //验证member是否是key的set元素 srandmember 集合key //随机查询名称为key的一个集合元素
SortedSet集合类型(顺序)
zadd zrange key startIndex endIndex value
Redis 事务
Redis乐观锁 127.0.0.1:6379> set age 30 OK 127.0.0.1:6379> discard #关闭(回滚)事务 127.0.0.1:6379> mutil #开启事务 测试: 127.0.0.1:6379> set age 31 QUEUED 127.0.0.1:6379> set age 32 QUEUED 127.0.0.1:6379> exec
- OK
- OK
127.0.0.1:6379> get age “32”
集群操作
创建不含slaver 的集群
./src/redis-cli --cluster create 172.16.71.183:7001 172.16.71.183:7002 172.16.71.183:7003 --cluster-replicas 0
变更主从关系
redis-cli -h 192.168.0.251 -p 6390 cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
cluster meet 将指定节点加入到集群
客户端连接
/usr/redis/src/redis-cli -h 127.0.0.1 -p 6379 -a 123456
参考资料
Codis的架构设计 https://blog.csdn.net/shmiluwei/article/details/51958359
Redis持久化存储(AOF与RDB两种模式) https://www.cnblogs.com/logo-fox/p/7810530.html
Redis 主从架构搭建及原理详解 https://www.jianshu.com/p/f0e042b95249
Jedis操作单节点redis,集群及redisTemplate操作redis集群(三) https://blog.csdn.net/qq_36305027/article/details/80686229
JedisCluster 原理介绍 https://www.jianshu.com/p/5ca98b5a336b
Springboot2整合Redis以及jackson序列化 https://blog.csdn.net/zaincs/article/details/84399584
基于Spring的项目中Redis存储对象使用Jackson序列化方式 https://www.zifangsky.cn/1366.html
Redis-5.0.5集群配置 https://www.cnblogs.com/aquester/p/10916284.html
Redis5 cluster人工指定主从关系 https://blog.csdn.net/tianshi_rain/article/details/86612193
集群通信 https://blog.csdn.net/huwei2003/article/details/50973893
|