一篇文章学会Redis

目录

介绍与安装

概述

安装

Redis数据类型

String

Hash

List

Set

Zset

Redis通用命令

Java程序操作Redis

[Spring Data Redis](#Spring Data Redis)

其他类型操作


介绍与安装

概述

当用户登录后会频繁访问首页,每次都需要查询数据库,这让数据库压力很大,我们可以通过添加缓存Redis方式降低MySQL数据库压力。

Redis是一个基于内存key-value结构的数据库,在项目开发中常用于做高速缓存、消息队列。(NoSQL数据库)

  • 主要特点:

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

    • 丰富的数据类型支持,value支持多种数据类型,功能丰富

    • 单线程,每个命令都具备原子性

    • 支持数据的持久化

    • 企业应用十分广泛

官网:https://redis.io/

中文网:https://www.redis.net.cn/

NoSql:(Not Only SQL),不仅仅是SQL,泛指 非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。

  • 关系型数据库:Mysql、Oracle、SQL Server、DB2 等。

  • 非关系型数据库:Redis、MongoDB、MemCached 等。

安装

1)目录结构

2). 双击 startup.bat 脚本,即可运行Redis数据库。

这样,就将Redis数据库启动起来了,启动起来后,我们可以双击 redis-cli.exe 打开Redis的客户端,输入一个指令 ping,如果响应了PONG,那就说明客户端和服务端连接上了。

  • 双击 redis-cli.exe ,会打开redis的客户端,默认连接的就是本机的6379端口的redis服务。

  • 如果,要连接的是远程的Redis服务器,可以通过指定如下参数,进行连接:

    • -h :ip地址

    • -p :端口号

    • 比如:redis-cli.exe -h 192.168.100.200 -p 6379


Redis数据类型

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

|-------------------|--------|--------------------------------------|
| 数据类型 | 介绍 | 描述 |
| string | 字符串 | 普通字符串,redis中最简单的数据类型 |
| hash | 哈希 | 也叫散列,类似于java中的HashMap结构 |
| list | 列表 | 按照插入顺序排列,可以有重复元素,类似于java中的LinkedList |
| set | 集合 | 无序集合,没有重复元素,类似于java中的HashSet |
| zset / sorted-set | 有序集合 | 集合中每个元素关联一个分数(score),根据分数排序,没有重复元素 |


String

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

|----------------------------------|--------------------------------------------------|
| 命令 | 作用描述 |
| set key value | 设置指定 key 的值 |
| get key | 获取指定 key 的值 |
| mset key value [key value ...] | 同时设置一个或多个 key-value 对 |
| mget key1 key2 ... | 获取所有(一个或多个)给定 key 的值 |
| setnx key value | 只有在 key 不存在时设置 key 的值 |
| incr key | 将 key 中储存的数字值增一 |
| incrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
| decr key | 将 key 中储存的数字值减一 |
| decrby key decrement | key 所储存的值减去给定的减量值(decrement) |
| setex key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |

Setex常用在验证码中

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


Hash

Hash是一个string类型的field和value的映射表,特别适合存储对象。常见的操作命令:

|--------------------------------------------|--------------------------------------|
| 命令 | 作用描述 |
| hset key field value | 将哈希表 key 中的字段 field 的值设为 value |
| hget key field | 获取存储在哈希表中指定字段的值 |
| hmset key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
| hmget key field1 [field2] | 获取所有给定字段的值 |
| hdel key field2 [field2] | 删除一个或多个哈希表字段 |
| hkeys key | 获取所有哈希表中的字段 |
| hvals key | 获取哈希表中所有值 |
| hgetall key | 获取在哈希表中指定 key 的所有字段和值 |

user是大key name是小key

复制代码
hset user name Tom

List

List(列表)是简单的字符串列表,按照插入顺序排序,可以出现重复的元素

常用命令有:

|---------------------------------|------------------------------|
| 命令 | 作用描述 |
| lpush key value1 [value2] | 将一个或多个值插入到列表头部 |
| rpush key value1 [value2] | 在列表中添加一个或多个值 |
| lrange key start stop | 获取列表指定范围内的元素 |
| lpop key | 移出并获取列表的第一个元素 |
| rpop key | 移除并获取列表最后一个元素 |
| llen key | 获取列表长度 |
| rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |

l开头是操作列表左边,r开头可以理解为操作列表的右边。


Set

Set(集合)是无序集合,集合中不能出现重复元素。

常用命令有:

|------------------------------|-----------------|
| 命令 | 作用描述 |
| sadd key member1 [member2] | 向集合添加一个或多个成员 |
| scard key | 获取集合的成员数 |
| smembers key | 返回集合中的所有成员 |
| spop key | 移除并返回集合中的一个随机元素 |
| sinter key1 [key2] | 返回给定所有集合的交集 |
| sunion key1 [key2] | 返回所有给定集合的并集 |
| sdiff key1 [key2] | 返回给定所有集合的差集 |
| srem key member1 [member2] | 移除集合中一个或多个成员 |


Zset

Sorted Set(有序集合)和集合一样不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来对集合中的成员进行排序。

常用命令有:

|----------------------------------------------------|------------------------------|
| 命令 | 作用描述 |
| zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
| zrange key start stop [withscores] | 通过索引区间返回有序集合成指定区间内的成员,分数从底到高 |
| zrangebyscore key min max [withscores] [limit] | 通过分数返回有序集合指定区间内的成员 |
| zrevrange key start stop [withscores] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
| zrevrangebyscore key max min [withscores] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
| zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
| zrem key member [member ...] | 移除有序集合中的一个或多个成员 |
| zcard key | 获取有序集合的成员数 |


Redis通用命令

所谓通用命令,指的是不区分数据类型都可以使用的命令:

|--------------|---------------------------|
| 命令 | 作用描述 |
| keys pattern | 查找所有符合给定模式( pattern)的 key |
| exists key | 检查给定 key 是否存在 |
| type key | 返回 key 所储存的值的类型 |
| del key | 该命令用于在 key 存在时删除 key |


Java程序操作Redis

Spring Data Redis

Spring生态中的Spring Data项目提供了统一的数据库操作框架,其中Spring Data Redis模块对Redis底层客户端进行了高度封装,显著简化了Redis数据库的开发和操作。

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

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

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

1). 在 pom.xml 中引入SpringDataRedis的依赖

在 模块的 pom.xml 中引入如下依赖:

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2). application.yml 中配置Redis的数据库信息

指定连接的是本地的Redis,注解地址 127.0.0.1 ,端口号 6379。

复制代码
spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379

3). 注入RedisTemplate(直接注入就可以不用新建)操作Redis数据库

java 复制代码
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
    
    //操作string类型
    @Test
    public void testString(){
        //存
        redisTemplate.opsForValue().set("name", "QK");
        //取
        System.out.println(redisTemplate.opsForValue().get("name"));

        //设置过期时间
        redisTemplate.opsForValue().set("gender", "男", 60, TimeUnit.SECONDS);
        //取
        System.out.println(redisTemplate.opsForValue().get("gender"));
    }

操作完毕后,我们可以看到数据确实存入了Redis,有两个key:name、gender。

由于SpringDataRedis中提供的核心API,RedisTemplate底层在操作key、value的时候,对key和value进行了序列化操作,默认是通过JdkSerializationRedisSerializer实现的序列化,所以最终展示出来的就是我们看到的这个key,这个key就是序列化之后的效果。

在存入数据的时候,会自动的对数据进行序列化,在查询数据的时候,会自动的对查询的结果进行反序列化。

如果我们想看到普通字符串类型的key(比如:namegender,而不是:"\xac\xed\x00\x05t\x00\x04name"),不要按照默认的序列化方式,进行序列化,我们是可以自己指定序列化方式的。具体操作如下:

在模块的包下增加一个配置类:

java 复制代码
@Configuration
public class RedisConfig {

    //指定Redis的key的序列化方式为string
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //自定义RedisTemplate
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        //指定序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        return template;
    }

}
  • **@Configuration:**用来声明当前类是一个配置类(也是IOC容器的bean,底层封装了@Component注解)。

  • **@Bean:**声明bean的注解,作用在方法上,会将方法的返回值对象加入IOC容器,成为IOC容器的bean对象。


其他类型操作

java 复制代码
/**
 * list 类型测试
 */
@Test
public void testList(){
    //存一个
    redisTemplate.opsForList().leftPush("mylist", "A");
    //存多个
    redisTemplate.opsForList().leftPushAll("mylist", "B", "C", "D");
    //移除一个
    System.out.println(redisTemplate.opsForList().rightPop("mylist"));
    //取所有
    System.out.println(redisTemplate.opsForList().range("mylist", 0, -1));
}

/**
 * set 类型测试
 */
@Test
public void testSet(){
    //存
    redisTemplate.opsForSet().add("myset", "A", "B", "C", "D", "E", "F", "G");
    //取所有
    System.out.println(redisTemplate.opsForSet().members("myset"));
    //获取集合大小
    System.out.println(redisTemplate.opsForSet().size("myset"));
    //取一个
    System.out.println(redisTemplate.opsForSet().pop("myset"));
}

/**
 * hash测试
 */
@Test
public void testHash(){
    //存
    redisTemplate.opsForHash().put("myhash", "name", "QK");
    redisTemplate.opsForHash().put("myhash", "age", "18");
    redisTemplate.opsForHash().put("myhash", "gender", "男");
    //取
    System.out.println(redisTemplate.opsForHash().get("myhash", "name"));
    System.out.println(redisTemplate.opsForHash().get("myhash", "age"));
    //获取所有key
    System.out.println(redisTemplate.opsForHash().keys("myhash"));
    //获取所有value
    System.out.println(redisTemplate.opsForHash().values("myhash"));
}

/**
 * zset 测试
 */
@Test
public void testZset(){
    //存
    redisTemplate.opsForZSet().add("myzset", "A", 1);
    redisTemplate.opsForZSet().add("myzset", "B", 2);
    redisTemplate.opsForZSet().add("myzset", "C", 3);
    redisTemplate.opsForZSet().add("myzset", "D", 4);
    redisTemplate.opsForZSet().add("myzset", "E", 5);
    redisTemplate.opsForZSet().add("myzset", "F", 6);
    // 取
    System.out.println(redisTemplate.opsForZSet().range("myzset", 0, -1));
    // 根据分数取
    System.out.println(redisTemplate.opsForZSet().rangeByScore("myzset", 0, 3));
}
相关推荐
星辰_mya2 小时前
SQL 性能调优:EXPLAIN 详解与慢查询优化案例
数据库·sql·面试·架构师
xixingzhe22 小时前
spring boot druid 10秒超时问题
java·数据库·spring boot
IndulgeCui2 小时前
Kingbase 身份认证与权限控制实践—数据库安全的第一道防线
数据库
AAA_搬砖达人小郝2 小时前
SQL 高级查询技巧:WITH + UNION ALL + EXISTS + WHERE TRUE/FALSE 联合实战
数据库·sql
Yushan Bai2 小时前
RAC环境数据库节点异常重启问题的分析(存储光纤信号问题)
数据库
ok_hahaha2 小时前
java从头开始-黑马点评-分布式锁-redis实现基础版
java·redis·分布式
WINDHILL_风丘科技2 小时前
FlexPro高级应用之模板定制
数据库·汽车·汽车测试·flexpro
慎久2 小时前
SAP CDS对数据进行排序后读取第一条数据
数据库·cds·amdp
敢敢のwings2 小时前
智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)
数据库·redis·机器人