redis 基础知识

Redis最常见的几种应用场景

https://www.cnblogs.com/NiceCui/p/7794659.html

1.缓存/热数据
2.计数器
3.队列,redis发布/订阅模式
4.位操作(大数据处理),使用setbit、getbit、bitcount命令。
5.分布式锁(Distributed Lock)
6.最新列表,尝试redis的 LPUSH命令构建List。
7.排行榜(Rank/Leaderboard),谁得分高谁排名往上。命令:ZADD(有续集,sorted set)
8 速率限制器(Rate Limiter)
修改redis配置
bind 0.0.0.0
requirepass redis@123456
redis连接池lettuce

SpringBoot的redis连接池lettuce参数配置优化建议
https://www.cnblogs.com/devhg/p/16026422.html

spring:
  application:
    name: v5-gateway-application
  redis:
    lettuce: #lettuce客户端配置
      pool: #连接池配置
        max-active: 50 # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-wait: 10 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-idle: 20 # 连接池中的最大空闲连接 默认 8
        min-idle: 10 # 连接池中的最小空闲连接 默认 0
      cluster:
        refresh: #集群刷新
          adaptive: true #自动刷新集群 默认false关闭
#          period: 10M #定时刷新
    timeout: 1000 # 连接超时时间(毫秒)
    cluster: #集群配置
      nodes: #集群节点
        - 10.2.55.88:7001
        - 10.2.55.88:7002
        - 10.2.55.88:7003
        - 10.2.55.88:7004
        - 10.2.55.88:7005
        - 10.2.55.88:7006
      max-redirects: 3 #集群中重定向最大次数
批量删除

./redis-cli keys a2* | xargs ./redis-cli del

基础知识

Redis是一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存、消息中间件。
它支持多种数据结构,如字符串、散列(hash)、列表(list)、集合(set)、有序集合(sort set);与范围查询、bitmaps、hyperloglogs、地理空间、索引半径查询。
redis内置了副本(Replication)、事务(Transaction)、和不同级别的磁盘持久化(Persistence)、并通过哨兵机制、Cluster集群提供高可用性。

想要玩转redis,我们需要知道哪些知识点呢?
redis配置,默认,非默认,集群,多实例,连接池参数等
redis读写操作,RedisTemplate的基本使用。
几种序列化方式对比

RedisTemplate

RedisTemplate 封装了 RedisConnection,具有连接管理,序列化和 Redis 操作等功能。
几种序列化方式对比

高可用

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 – 清空当前所在数据库的数据

安装与编译

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在linux启动、关闭、后台运行命令
https://blog.csdn.net/asd123qwezxc1123/article/details/129867112
如果是用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
启动

linux系统下redis启动的三种方法
https://www.lxlinux.net/2183.html

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 发布订阅

历史性——3天内、更久的数据
实时性

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

  1. OK
  2. 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

其他

挖矿病毒

挖矿病毒,利用Redis的未授权访问漏洞进行攻击。Redis 默认配置为6379端口无密码访问,如果redis以root用户启动,攻击者可以通过公网直接链接redis,向root账户写入SSH公钥文件,以此获取服务器权限注入病毒

删除恶意脚本文件,直接rm删除不了,需要修改下文件的属性

cd /etc/
rm -f newinit.sh #提示无权限Permission denied
#查看文件属性
lsattr newinit.sh
#修改文件属性
chattr -ia newinit.sh

#修改文件属性
[root@localhost etc]# lsattr newinit.sh
----ia--------e----- newinit.sh

[root@c7 bin]# cd /usr/bin/
[root@c7 bin]# cp chattr chattr.new
[root@c7 bin]# chmod a+x chattr.new
[root@c7 bin]# chattr.new -i chattr
[root@c7 bin]# rm -f chattr.new
[root@c7 bin]# chmod a+x chattr

[root@localhost bin]# /usr/bin/chattr.new -ia /etc/newinit.sh
[root@localhost bin]# rm -rf /etc/newinit.sh

参考资料

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于学习Redis基础知识,可以按照以下思路进行学习: 1. 了解Redis的概念和特点:首先需要了解Redis是什么,它的主要特点是什么,它为什么被广泛应用于缓存、消息队列、会话管理等场景。 2. 安装和配置Redis:根据你的操作系统,安装Redis并进行相关配置。可以参考Redis官方文档或其他教程来完成这一步。 3. 学习Redis的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。了解每种数据结构的特点、用途和操作命令,并通过实际操作来加深理解。 4. 掌握Redis的常用命令:学习Redis的常用命令,如get、set、hget、hset、lpush、lrange、sadd、smembers等,了解每个命令的具体用法和参数含义。 5. 理解Redis的持久化机制:了解Redis的RDB和AOF两种持久化方式,以及它们的优缺点。学习如何进行备份和恢复数据。 6. 学习Redis的事务和Lua脚本:了解Redis事务的基本概念和使用方法,以及如何使用Lua脚本来进行复杂的操作。 7. 深入了解Redis的性能优化和高可用方案:学习如何优化Redis的性能,包括配置调优、使用合适的数据结构、合理地使用缓存等。同时了解Redis的高可用方案,如主从复制、哨兵模式和集群模式。 8. 学习Redis与其他技术的结合:了解Redis如何与其他技术进行结合,如与Python、Java等编程语言的配合使用,以及与Spring、Django等框架的整合。 以上是学习Redis基础知识的一个思路,你可以根据自己的实际情况和需求进行学习和拓展。推荐参考一些经典的Redis教程和实战案例,通过实际操作和项目实践来提升自己的技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值