Redis基础

2023-12-13 21:19:57

致谢:黑马所提供的redis相关资料

基础篇-04.初识Redis-安装Redis及启动的三种方式_哔哩哔哩_bilibili

一、Redis安装说明

安装

Redis的官方网站地址:Redis

启动:

设置开机自启:

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

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

vi /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.2.6/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



执行下面的命令,可以让redis开机自启:


systemctl enable redis


遇到的问题:

在关闭时,无法关闭,只好用??

kill -9? 进程号?

二、Redis客户端

1.redis-cli 使用

2.使用GUI,去连接linux上的redis

3.放行 防火墙的6379端口

1.查看防火墙端口

firewall-cmd --list-ports

2.开启端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent

3.重启防火墙

firewall-cmd --reload #重启

firewallsystemctl stop firewalld.service #停止

firewallsystemctl disable firewalld.service #禁止firewall开机启动

三、基础篇

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,

在官网? ?https://redis.io/commands 可以查看到不同的命令

1.Redis命令

1.1 Redis通用命令

1.2 String类型

Del是通用的删除命令。

关于INCRBY和INCRBYFLOAT 有点神奇,在增加步长到整数或小数时,达到了一次转换。

1.3? key的层级格式(不仅仅是String类型)

1.4 Hash类型

键值对? 里面又有一个 键值对

HMSET已经弃用了。现在全部用HSET就可以了

下面命令中的key没有写死,是灵活的变量,不用看错了。

1.5? List类型

第一个控制台

第二个控制台

1.6 set类型

cardinality? 集合中元素的数量

并集会将重复的元素去掉。

1.7 SortedSet

可以通过 REV前缀 ,指定为倒序

关于zrangeByScore的边界值,需要了解一下。

返回排序集中key处的所有元素,其得分介于min和max之间(包括得分等于min或max的元素)。这些元素被认为是从低到高分排序的。

2.Redis的java客户端

Redis官网中提供了各种语言的客户端,地址:https://redis.io/docs/connect/clients/

2.1 Jedis

引入依赖

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

建立连接

private Jedis jedis;

@BeforeEach
void setUp() {
    // 1.建立连接
    // jedis = new Jedis("192.168.150.101", 6379);
    jedis = JedisConnectionFactory.getJedis();
    // 2.设置密码
    jedis.auth("123321");
    // 3.选择库
    jedis.select(0);
}

测试并释放资源:

@Test
void testString() {
    // 存入数据
    String result = jedis.set("name", "虎哥");
    System.out.println("result = " + result);
    // 获取数据
    String name = jedis.get("name");
    System.out.println("name = " + name);
}

@Test
void testHash() {
    // 插入hash数据
    jedis.hset("user:1", "name", "Jack");
    jedis.hset("user:1", "age", "21");

    // 获取
    Map<String, String> map = jedis.hgetAll("user:1");
    System.out.println(map);
}
//释放资源
@AfterEach
void tearDown() {
    if (jedis != null) {
        jedis.close();
    }
}

2.2 Jedis连接池

2.3 SpringDataRedis客户端

2.3.1 快速入门

①引入完整依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.heima</groupId>
    <artifactId>redis-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>redis-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--common-pool-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <!--Jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

②配置redis
spring:
  redis:
    host: 192.168.150.101
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms

③注入RedisTemplate

因为有了SpringBoot的自动装配,我们可以拿来就用

@SpringBootTest
class RedisStringTests {

    @Autowired
    private RedisTemplate redisTemplate;
}
④编写测试
@SpringBootTest
class RedisStringTests {

    @Autowired
    private RedisTemplate edisTemplate;

    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("name", "虎哥");
        // 获取string数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

2.3.2 自定义序列化

由于序列化时使用的是 jdk自带的 objectInputStream 这种序列化,因此对于未实现serilizable接口的实体类 对象 会造成乱码问题。因此我们可以自定义序列化。

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = 
            							new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

2.3.3 为减少内存消耗,使用自带的StringRedisTemplate

省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:

@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON序列化工具
private static final ObjectMapper mapper = new ObjectMapper();

@Test
void testSaveUser() throws JsonProcessingException {
    // 创建对象
    User user = new User("虎哥", 21);
    // 手动序列化
    String json = mapper.writeValueAsString(user);
    // 写入数据
    stringRedisTemplate.opsForValue().set("user:200", json);

    // 获取数据
    String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
    // 手动反序列化
    User user1 = mapper.readValue(jsonUser, User.class);
    System.out.println("user1 = " + user1);
}

设置空闲连接,当有人来时可以直接用

2023/12/10? 疑惑记录

1. 关于redis的序列化和反序列化。

我认为比较重要的一点是? ?是否实现了 Serializable 接口

求助一下机器人:

文章来源:https://blog.csdn.net/qq_64071349/article/details/134895172
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。