首页 > 数据库 >Redis

Redis

时间:2023-07-20 09:12:30浏览次数:40  
标签:set Redis redis key org import

Redis

基于内存的key-value结构的非关系型数据库,远程字典服务

特点

基于内存存储,读写性能高

适合存储热点数据(热点商品,资讯,新闻)

使用范围广

能做什么

  • 数据缓存
  • 消息队列
  • 注册中心
  • 发布订阅

Redis入门

官网:https://redis.io

关系型数据库(RDBMS):

  • Mysql
  • Oracle
  • DB2
  • SQLServer

非关系型数据库(NoSql):

  • Redis
  • Mongo db
  • MemCached

下载与安装

Redis安装包分为windows版和Linux版:

下载后得到下面安装包:

image-20230718120421604

在Linux系统安装Redis步骤:

  1. 将Redis安装包上传到Linux到soft目录

  2. 解压安装包,命令:tar -xvf redis-4.0.0.tar.gz -C /usr/local

  3. 安装Redis的依赖环境gcc,命令:yum install gcc-c++

  4. 进入/usr/local/redis-4.0.0,进行编译,命令:make

  5. 进入redis的src目录进行安装,命令:make install

  6. 进入/usr/local/redis-4.0.0 ,把redis.conf文件拷贝到src目录中 cp redis.conf src

  7. 修改redis.conf文件,需要修改的地方有:

    1. 修改redis.conf文件,让其在后台启动不要霸屏的方式启动, 将配置文件中的daemonize配置项改为yes,默认值为no。

    2. reids默认是没有密码的,如果你需要有密码,将配置文件中的 # requirepass foobared 配置项取消注释,默认为注释状态。foobared为密码,可以根据情况自己指定。(选做)

    3. redis的服务默认只是允许本机连接,其他机器默认情况是不被允许连接,如果允许其他机器也能连接linux的reids服务,注释掉 bind 127.0.0.1

      protected-mode yes改成no 关闭保护模式

    4. 如果redis服务是后台启动 我们的关闭redis服务如下:

      在src目录下 ./redis-cli shutdown

      启动redis服务 在src目录下

      ./redis-server redis.conf

  8. 启动redis的服务, 使用 redis-server redis.conf

  9. 启动客户端去连接服务端测试: 启动客户端的方式:

    1. 方式一(没有密码方式): 在src目录中 ./redis-cli

image-20230718120446561

  1. 方式二(如果存在密码情况): 在src目录中: ./redis-cli -h 127.0.0.1 -p 端口号 -a 密码

image-20230718120459517

启动和停止Redis

执行Redis服务启动脚本文件redis-server

通过启动日志可以看到,Redis默认端口号为6379

Ctrl + C停止Redis服务

通过redis-cli可以连接到本地的Redis服务,默认情况下不需要认证即可连接成功。

退出客户端可以输入exit或者quit命令。

数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

字符串 string
哈希 hash
列表 list
集合 set
有序集合 sorted set /zset

解释说明:

字符串(string):普通字符串,常用

哈希(hash):适合存储对象

列表(list):按照插入顺序排序,可以有重复元素

集合(set):无序集合,没有重复元素

有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

Redis常用命令

4.1 字符串string操作命令

Redis 中字符串类型常用命令:

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
  • SETNX key value 只有在 key 不存在时设置 key 的值

更多命令可以参考Redis中文网:https://www.redis.net.cn

4.2 哈希hash操作命令

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值
  • HGETALL key 获取在哈希表中指定 key 的所有字段和值

4.3 列表list操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素 stop为-1获取所有
  • RPOP key 移除并获取列表最后一个元素
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

4.4 集合set操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SDIFF key1 [key2] 返回给定所有集合的差集
  • SREM key member1 [member2] 移除集合中一个或多个成员

4.5 有序集合sorted set操作命令

Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。

常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member ...] 移除有序集合中的一个或多个成员

4.6 通用命令

Redis中的通用命令,主要是针对key进行操作的相关命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位 -1为永不过期
  • DEL key 该命令用于在 key 存在是删除 key

在Java中操作Redis

Redis 的 Java 客户端很多,官方推荐的有三种:

  • Jedis
  • Lettuce
  • Redisson

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

5.2 Jedis

Jedis 是 Redis 的 Java 版本的客户端实现。

maven坐标:

 <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

使用 Jedis 操作 Redis 的步骤:

  1. 获取连接
  2. 执行操作
  3. 关闭连接

示例代码:

package com.tyhxzy.test;

import org.junit.Test;
import redis.clients.jedis.Jedis;

public class AppTest {


    @Test
    public void test01(){
        //1. 创建Jedis连接Redis
        Jedis jedis = new Jedis("192.168.174.128",6379);
        //2. 操作
        jedis.set("name","张三");
        //3. 关闭连接
        jedis.close();
    }

}

5.3 Spring Data Redis

5.3.1 介绍

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

网址:https://spring.io/projects/spring-data-redis

maven坐标:

<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-redis</artifactId>
	<version>2.4.8</version>
</dependency>

Spring Boot提供了对应的Starter,maven坐标:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对hash类型的数据操作
  • ListOperations:针对list类型的数据操作

5.3.2 使用方式

5.3.2.1 环境搭建

第一步:创建maven项目springdataredis_demo,配置pom.xml文件

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
    </parent>
    
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
     
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
   

第二步:编写启动类

package com.tyhxzy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

}

第三步:配置application.yml

spring:
  redis:
    host: 192.168.206.128
    port: 6379
    #    password:  有密码你才写
    database: 0 #redis默认有16个数据库, 操作的数据库是哪个
    jedis:
      pool:
        max-active: 10 #最大链接数,连接池中最多有10个
        max-idle: 5   # 最大空闲数
        min-idle: 1   #最小空闲数
        #举个例子: 连接池初始化3个链接, 客户拿走2个链接,空闲1个,达到最小的空闲数,必须马上增加
        max-wait: 1ms #连接池最大阻塞等待时间

解释说明:

spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。

可以通过修改Redis配置文件来指定数据库的数量。

第四步:

springdata_redis默认帮我们创建的RedisTemplate对象是使用jdk的序列号器帮我们键与值存储到redis中,而jdk的序列号器对键与值是采用二进制的方式存储的,所以我们会看到乱码的情况。如果我们需要看得懂,那么需要修改redistemplate使用的序列号器才行。 提供配置类

package com.tyhxzy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class MyRedisAutoConfig {


    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer()); //key的序列号器
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //值序列号器
        return template;
    }
}

添加依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tyhxzy</groupId>
    <artifactId>springdataredis_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
    </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.1</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.5</version>
            </plugin>
        </plugins>
    </build>
</project>

解释说明:

当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别

第五步:提供测试类

package com.tyhxzy.test;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class RedisTemplateTest {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

   

}

5.3.2.2 操作字符串类型数据
package com.tyhxzy.test;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class RedisTemplateTest {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 操作字符串类型
     */
    @Test
    public void testStr(){
        //1. 得到操作字符串类型的对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //2. 操作字符串
        //存储
        valueOperations.set("name","狗娃");


        //获取
        System.out.println("获取到的值:"+ valueOperations.get("name"));
        //设置过期时间
        valueOperations.set("age","18",1, TimeUnit.MINUTES); //设置过期时间为一分钟

        //如果不存在key则添加,则则不添加
        valueOperations.setIfAbsent("name","狗剩");
    }

    /**
     * 操作hash类型
     */
    @Test
    public void testHash(){
        //1. 得到操作hash类型的客户端对象
        HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
        //存储
        hashOperations.put("person","id","110");
        hashOperations.put("person","name","狗娃");
        //取
        System.out.println("姓名:"+ hashOperations.get("person","name"));
        //所有field
        Set<Object> set = hashOperations.keys("person");
        for (Object key : set) {
            System.out.print(key+",");
        }
        System.out.println();

        //所有值
        List<Object> list = hashOperations.values("person");
        for (Object value : list) {
            System.out.print(value+",");
        }
        System.out.println();
    }



   

}

5.3.2.3 操作哈希类型数据
  @Test
    public void testHash(){
        //1. 得到哈希客户端
        HashOperations hashOperations = redisTemplate.opsForHash();
        //2. 操作
        hashOperations.put("p1","id","110");
        hashOperations.put("p1","name","邓天阳");
        hashOperations.put("p1","age",28);

        //获取
        System.out.println("天阳年龄:"+hashOperations.get("p1","age"));

        //获取所有field
        Set set = hashOperations.keys("p1");
        set.forEach(System.out::println);


        List list = hashOperations.values("p1");
        for (Object item : list) {
            System.out.print(item+",");
        }
5.3.2.4 操作列表类型数据
/**
     * 操作list类型
     */
    @Test
    public void testList(){
        //1. 得到操作List类型的客户端
        ListOperations listOperations = redisTemplate.opsForList();
        //2.添加
        listOperations.leftPushAll("list","王友华","增顺","陈泳");
        //3. 获取
        System.out.println("出来的是:"+ listOperations.range("list",0,-1));

        //4. 获取大小
        System.out.println("总长度:"+listOperations.size("list"));
    }
5.3.2.5 操作集合类型数据
 /**
     * 操作set类型
     */
    @Test
    public void testSet(){
        //1. 得到操作Set类型的客户端
        SetOperations setOperations = redisTemplate.opsForSet();
        //2. 存储
        setOperations.add("set1","凤姐","如花","芙蓉姐姐","黄媚-欣望");

        //3. 获取
        Set set1 = setOperations.members("set1");
        set1.stream().forEach(s-> System.out.print(s+","));

        //4. 删除
        setOperations.remove("set1","芙蓉姐姐");

        System.out.println("删除后内容......");
        set1 = setOperations.members("set1");
        set1.stream().forEach(s-> System.out.print(s+","));

    }
5.3.2.6 操作有序集合类型数据
    /**
     * 操作set类型
     */
    @Test
    public void testSortedset(){
        //1. 得到客户端
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //2. 添加
        zSetOperations.add("zset","老钟",100);
        zSetOperations.add("zset","欣望",1000);
        zSetOperations.add("zset","麟业",90);

        //3. 遍历
        Set set = zSetOperations.range("zset", 0, -1);
        for (Object key : set) {
            System.out.println(key+","+zSetOperations.score("zset",key));
        }
        //4. 修改分数
        zSetOperations.incrementScore("zset","麟业",3000);

        System.out.println("【=====修改后分数====】");
        //5. 遍历
        set = zSetOperations.range("zset", 0, -1);
        for (Object key : set) {
            System.out.println(key+","+zSetOperations.score("zset",key));
        }
    }
5.3.2.7 通用操作
 /**
     * 通用操作
     */
    @Test
    public void baseTest(){
        //1. 所有键
        Set<String> keys = redisTemplate.keys("*");
        System.out.println("=======所有键==========");
        for (String key : keys) {
            System.out.print(key+",");
        }
        System.out.println();
        //2. 判断有没有键
        Boolean flag = redisTemplate.hasKey("set");
        System.out.println("是否存在set1:"+ flag);
        //3. 类型
        System.out.println("类型:"+redisTemplate.type("set"));

        //4. 删除
        redisTemplate.delete("set");
    }

标签:set,Redis,redis,key,org,import
From: https://www.cnblogs.com/YxinHaaa/p/17567353.html

相关文章

  • Redis主从复制和哨兵模式
    一、Redis主从复制 1、配置Redis服务器启动服务自动建立主从复制1)配置ntp时间服务器并同步时间2)修改主配置文件自动挂载节点3)启动服务(所有主机)4)查看复制群集状态2、手动配置主从复制  1)将第一台从节点加入到群集中[root@centos02~]#redis-cli-h192.168.100.20-p6379-a......
  • 观看视频历史记录放数据库还是redis
    观看视频历史记录放数据库还是Redis?随着互联网的飞速发展,视频网站逐渐成为人们获取信息、娱乐和学习的主要平台之一。在视频网站上观看的视频数量非常庞大,而用户观看的视频历史记录也具有一定的价值。那么,我们应该将观看视频历史记录放在数据库中还是Redis中呢?本文将从数据特点、......
  • 多主机 docker redis集群
    多主机DockerRedis集群在分布式系统中,Redis是一个常用的内存数据库,它提供了高性能的键值存储。然而,在面对大流量的情况下,单个Redis实例可能无法满足需求。为了提高可用性和性能,我们可以使用多主机的Redis集群。Docker是一个流行的容器化平台,它可以帮助我们轻松地创建和......
  • 多线程,redis怎么写数据
    项目方案:多线程写数据到Redis介绍在现代应用程序开发中,Redis是一个非常流行的内存数据库,它提供了高性能的键值存储。然而,在高并发场景下,写入大量数据到Redis可能成为性能瓶颈。为了解决这个问题,我们可以使用多线程来提高写入数据到Redis的效率。本文将介绍一个项目方案,通过......
  • 使用上一题安装的Redis服务。在Redis中,AOF配置为以三种不同的方式在磁盘上执行wr
    Redis中AOF执行方式的配置详解在使用Redis时,持久化是非常重要的一个功能,它可以确保数据在Redis重启后不会丢失。Redis提供了两种持久化方式:RDB(RedisDatabase)和AOF(AppendOnlyFile)。本文将重点介绍AOF配置以及如何以三种不同的方式在磁盘上执行AOF。AOF配置在Redis的配置文件re......
  • @EnableRedisIndexedHttpSession
    使用@EnableRedisIndexedHttpSession增强SpringSession在Spring框架中,Session管理是Web应用开发中常见的需求之一。SpringSession是Spring提供的解决方案之一,它可以用于替代传统的Servlet容器提供的Session管理机制。SpringSession提供了一种使用不同的存储后端(如内存、Redis、......
  • 转:springboot2.0 集成redis服务详解,以及 (Lettuce & Jedis)
    springboot2.0集成redis服务详解,以及(Lettuce&Jedis)   ......
  • Since Redis always uses the last processed
    RedisandItsUseofLastProcessedDataRedisisanopen-source,in-memorydatastructurestorethatcanbeusedasadatabase,cache,andmessagebroker.OneoftheuniquefeaturesofRedisisitsabilitytousethelastprocesseddataefficiently.Int......
  • 编译安装redis6.2.13集群-哨兵模式
    下载并编译Redis虽然使用SLES15进行编译,但是理论上在其它系统上也是可行的,我们把编译所需要的依赖包安装即可。Redis我们选择6.2.13这个版本,我们先随便找个节点进行编译产生二进制文件#首先安装依赖包zypperref&&zypperinstallgccmakesystemd-devel#SLES/SUSEyu......
  • docker redis集群搭建
    DockerRedis集群搭建介绍Redis是一款高性能的键值存储数据库,被广泛用于缓存、队列、计数器等场景。而Docker是一种容器化技术,可以方便地部署、管理应用程序。本篇文章将详细介绍如何使用Docker搭建Redis集群,以提高应用的可靠性和性能。准备工作在开始搭建Redis集群之前,我们需......