Redis

1、 安装Redis


1.1 安装Redis依赖

Redis基于C语言编写,首先需要安装Redis多需要的gcc依赖

yum install -y gcc tcl
# 如果 输入gcc -v版本过低后面会出现错误

# 1、安装gcc套装:依次执行以下命令

yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
# 2、升级gcc

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
# 3、执行完上述命令后再次make即可。

1.2 上传安装包并解压

下载安装包后放入 /usr/local/src

tar -zxvf redis-6.2.6.tar.gz

cd redis-6.2.6

make && make install

1.3 启动

redis的启动方式有很多种,例如:

  • 默认启动
  • 指定配置启动
  • 开机自启

1.3.1 默认启动

任意目录下运行一下目录即可运行

redis-server

1.3.2 指定配置运行

我们先把目录中的redis.conf备份一份:

cp redis.conf redis.conf.bak

然后修改redis.conf文件中的一些配置:

# 监听的地址,默认是127.0.0.1,会导致只能本地访问,修改为0.0.0.0则可以在任何IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 摩玛设置后访问Redis必须设置密码
requirepass 1727

Redis的其他常见配置

# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server是的命令,日志、持久化等文件会保存在这个文件
dir .
# 数据库数量,设置为1,表示只使用1个库,默认有16个库,编号0-15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile “redis.log”

启动Redis:

# 进入redis安装目录
cd /usr/local/src/redis-6.2.6
# 启动,配置文件选定为我们刚才修改的配置文件
redis-server redis.conf

停止服务:

redis-cli -u 1727 shutdown

1.3.3 开机自启

我们也可以通过配置来实现开机自启

首先,新建一个系统服务文件

vim /etc/systemd/system/redis.service

内容如下:

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.0.16/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然后重新加载系统服务:

systemctl daemon-reload

现在,我们可以用下面这组命令来操作redis了:

# 启动
systemctl start redis

# 关闭
systemctl stop redis

# 重启
systemctl restart redis

# 状态
systemctl status redis

# 开机自启
systemctl enable redis

2、 Redis客户端


安装完成Redis,我们可以操作Redis,实现数据的CRUD了。这需要使用Redis的客户端,包括:

  • 命令行客户端
  • 图形化桌面客户端
  • 编程客户端

2.1 Redis命令行客户端

redis-cli [options] [commonds]

其中常见的option有:

  • -h 127.0.0.1:指定要连接的redis结点的ip地址,默认是127.0.0.1
  • -p 6369:指定要连接的redis结点的端口,默认是6379
  • -a 17278:指定redis的访问密码

2.2 图形化桌面客户端

GitHub上有大神编写了Redis的图形化桌面客户端,地址:https:///uglide/RedisDesktopManager

不过该仓库提供的是RedisDesktopManager的源码,并未提供windows安装包。

在下面这个仓库可以找到安装包:https:///lework/RedisDesktopManager-Windows/releases

3、 Redis常见命令


3.1 数据类型介绍

类型

例子

String

hello world

Hash

{name: “jack”,age: 12}

List

[A->B->C->D->E->F->G]

Set

{A, B, C}

SortedSet

{A: 1,B: 2,C: 3}

GEO

{A: (120.3,30.5) }

BitMap

0110110101110101011

HyperLog

0110110101110101011

3.1.1 String

根据字符串的格式不同,又可分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

String常见命令:

SET [key] [value] # 添加或修改一个String类型的键值对
GET [key]
MSET [key] [value] [key1] [value1]...
MGET [key] [key1]...
INCR [key] # 让一个key的值增加1
INCRBY [key] 4 # 让一个key的值增加指定数
INCRBYFLOAT [key] 3.14
SETNX [key] [value] # 不存在这个key才执行,不然不执行
SETEX [key] [seconds] [value] # 添加一个key并且设置有效期

3.1.2 Hash

KEY

VALUE

field

value

liucheng:user:1

name

Jack

age

21

Hash常见命令

HSET [key] [field] [value]
HGET [key] [field]
HMSET [key] [field] [value] [field] [vlaue]...
HMGET [key] [field] [field]...
HGETALL [key]
HKEYS [key]
HVALS [key]
HINCRBY [key] [field] 4
HSETNX [key] [field] [value]

3.1.3 List

特征和LinkedList类似的双向链表:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

List常见命令:

LPUSH [key] [element] [element]...
LPOP [key]	# 取链表左边的值并弹出
RPUSH [key] [element] [element]...
RPOP [key]
LRANGE [key] start end # 取链表start到end的值,不弹出
BLPOP && BRPOP [key] [time] # 阻塞式获取

3.1.4 Set

与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

Set常见命令:

SADD [key] [member]...
SREM [key] [member]...
SCARD [key] # 获得set中元素的个数
SISMEMBER [key] [member] # 判断一个元素是否存在于set中
SMEMBERS # 获得set中所有的元素


SINTER [key1] [key2] # 获得两个集合的交集 key1∩key2
SDIFF [key1] [key2] # 获得两个集合的差集 key1-key2
SUNION [key1] [key2] # 获得两个集合的并集 key1∪key2

3.1.5 SortedSet

与TreeSet有些类似,但底层结构差别很大

  • 可排序
  • 元素不重复
  • 查询速度快

SortedSet常见命令:

# 这里的score是排序的依据

ZADD [key] [score] [member] # 存储数据
ZREM [key] [member]	
ZSCORE [key] [member]	# 获得其中指定元素的score
ZRANK [key] member	# 获取其中指定元素的排名,从0开始
ZCARD [key]	 # 获得sorted set的元素个数
ZCOUNT [key] min max	# 统计score在其中范围的元素的个数
ZINCRBY [key] increment member	# 给指定元素的score增加increment
ZRANGE [key] min max	# 获得score的排名在其中范围内的元素,从0开始
ZRANGEBYSCORE [key] min max 	# 获得score在其中范围中的元素
ZDIFF、ZINTER、ZUNION [key1] [key2] # 同Set

# 所有的默认升序,要降序就所有的命令的Z后面加上REV(reverse)即可。ps:ZREVADD

3.2 其他常用命令

# KEYS:查看符合模板的所有key
KEYS *
# DEL:删除一个指定的key
DEL k1
# EXISTS:判断key是否存在
EXISTS k1
# EXPIRE:给一个key设置有效期(秒数),有效期到时key会被自动删除
EXPIRE k1 20
# TTL k1:查看一个key的有效期,-1为永久,-2为过期或者没有,正数为秒数
TTL k1

4、 Redis的java客户端


4.1 Jedis

  1. 引入依赖
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.2.0</version>
</dependency>
  1. 配置连接池
public class JedisConnectionFactory {
    private static JedisPool jedisPool = null;

    static{
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        // 最大连接
        jedisPoolConfig.setMaxTotal(8);
        // 最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        // 最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        // 设置最长等待时间
        jedisPoolConfig.setMaxWait(Duration.ofMillis(200));
        jedisPool=new JedisPool(jedisPoolConfig,"192.168.168.130",6379,
                1000,"1727894442");
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

4.2 SpringDataRedis

SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单.其中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同类型中:

API

返回值类型

说明

redisTemplate.opsForValue()

ValueOperations

操作String类型数据

redisTemplate.opsForHash()

HashOperations

操作Hash类型数据

redisTemplate.opsForList()

ListOperations

操作List类型数据

redisTemplate.opsForSet()

SetOperations

操作Set类型数据

redisTemplate.opsForZSet()

ZSetOperations

操作SortedSet类型数据

redisTemplate

通用的命令

  1. 引入依赖
<!--Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>
  1. 配置文件
spring:
  redis:
    host: 192.168.168.130
    port: 6379
    password: 1727894442
    database: 0
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 200

4.2.1 解决序列化问题

4.2.1.1 自定义RedisTemplate序列化器
  1. 引入依赖
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
  1. 设置配置类
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建一个RedisTemplate对象
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        //设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        
        return redisTemplate;
    }
}
4.2.1.2 使用自带的序列化类

StringRedisTemplate类,key和value都是用的是String类

@SpringBootTest
public class RedisTest {
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    void testString(){
        redisTemplate.opsForValue().set("name","刘成");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
}