Redis常用命令和Java操作Redis教程

news2024/9/23 15:26:30

Redis介绍

关系型数据库(RDBMS)非关系型数据库(NoSql)
MysqlRedis
OracleMongo db
DB2MemCached
SQLServer

Redis是一个基于内存的key-value结构的数据库。
特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

应用场景

  • 缓存
  • 任务队列
  • 消息队列
  • 分布式锁

Redis常用数据类型

在这里插入图片描述

Redis常用命令

字符串常用命令

  • SET key value 设置指定key的值,key相同则覆盖
  • GET key 获取指定key的值
  • DEL key 删除指定key,通用操作
  • SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
  • SETNX key value 只有在key不存在时设置key的值

哈希常用命令

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的所有字段和值

在这里插入图片描述

列表常用命令

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

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

在这里插入图片描述

集合常用命令

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

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

在这里插入图片描述

有序集合常用命令

与集合最大的区别就是通过score使集合有序

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…]                               移除有序集合中的一个或多个成员

通用命令

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

Java操作Redis

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

  • Jedis
  • Lettuce
  • Redisson

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

Jedis的maven坐标:

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

普通项目使用Redis

  • 首先导入Jedis的maven坐标
  • 获取连接
  • 执行操作
  • 关闭连接
public void test{
    Jedis jedis = new Jedis("127.0.0.1","6379");
    jedis.set("key1","5");
    jedis.close();
}

SpringBoot中使用Redis

首先将对应的坐标导入:

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

在配置文件中进行redis的相关配置:

spring:
  application:
    name: springdataredis_demo
  #Redis相关配置
  redis:
    host: localhost
    port: 6379
    password: 123456
    database: 0 #操作的是0号数据库
    jedis:
      #Redis连接池配置
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4 #连接池中的最大空闲连接
        min-idle: 0 #连接池中的最小空闲连接

RedisTemplate

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

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

Redis配置类:RedisConfig

作用:如果我们通过RedisTemplate将数据保存到Redis中,默认使用的是key序列化器是JdkSerializationRedisSerializer,这样产生的问题就是我们在其他方式下查询该key是通过序列化后的,结果跟我们通过RedisTemplate操作不一致,当然这只是影响其他方式查询,并不影响RedisTemplate方式查询,因为它自己在查询时会通过反序列化的方式将其还原成我们赋值时的字符串。value也是同理,但value一般不设置。

总结:不设置也没有关系,只是会影响我们在非RedisTemplate方式下key的查询结果。

例如通过RedisTemplate方式设置一个key为city,通过本地客户端方式连接后查询到的键为\xac\xed\x00\x05…

通过本地的方式我们就查不到该key
在这里插入图片描述

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

}

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作String类型数据
     */
    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city123","beijing");

        String value = (String) redisTemplate.opsForValue().get("city123");
        System.out.println(value);

        redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);

        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
        System.out.println(aBoolean);
    }

    /**
     * 操作Hash类型数据
     */
    @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();

        //存值
        hashOperations.put("002","name","xiaoming");
        hashOperations.put("002","age","20");
        hashOperations.put("002","address","bj");

        //取值
        String age = (String) hashOperations.get("002", "age");
        System.out.println(age);

        //获得hash结构中的所有字段
        Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }

        //获得hash结构中的所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /**
     * 操作List类型的数据
     */
    @Test
    public void testList(){
        ListOperations listOperations = redisTemplate.opsForList();

        //存值
        listOperations.leftPush("mylist","a");
        listOperations.leftPushAll("mylist","b","c","d");

        //取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String value : mylist) {
            System.out.println(value);
        }

        //获得列表长度 llen
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String element = (String) listOperations.rightPop("mylist");
            System.out.println(element);
        }
    }

    /**
     * 操作Set类型的数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();

        //存值
        setOperations.add("myset","a","b","c","a");

        //取值
        Set<String> myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

        //删除成员
        setOperations.remove("myset","a","b");

        //取值
        myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

    }

    /**
     * 操作ZSet类型的数据
     */
    @Test
    public void testZset(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //存值
        zSetOperations.add("myZset","a",10.0);
        zSetOperations.add("myZset","b",11.0);
        zSetOperations.add("myZset","c",12.0);
        zSetOperations.add("myZset","a",13.0);

        //取值
        Set<String> myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }

        //修改分数
        zSetOperations.incrementScore("myZset","b",20.0);

        //取值
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }

        //删除成员
        zSetOperations.remove("myZset","a","b");

        //取值
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }
    }

    /**
     * 通用操作,针对不同的数据类型都可以操作
     */
    @Test
    public void testCommon(){
        //获取Redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //判断某个key是否存在
        Boolean itcast = redisTemplate.hasKey("itcast");
        System.out.println(itcast);

        //删除指定key
        redisTemplate.delete("myZset");

        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("myset");
        System.out.println(dataType.name());

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java8特性-Lambda表达式

&#x1f4d5;概述 在Java 8中引入了Lambda表达式作为一项重要的语言特性&#xff0c;可以堪称是一种语法糖。Lambda表达式使得以函数式编程的方式解决问题变得更加简洁和便捷。 Lambda表达式的语法如下&#xff1a; (parameters) -> expression (参数) -> {代码}其中&…

Apache HTTPD 漏洞复现

文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用 3. Apache HTTP Server_2.4.49 路径遍历和文件泄露漏洞-CVE-2021-41…

字体图标 IcoMoon

字体图标 展示的是图标&#xff0c;本质是字体。 轻量级︰一个图标字体要比一系列的图像要小。一旦字体加载了&#xff0c;图标就会马上渲染出来&#xff0c;减少了服务器请求 灵活性:本质其实是文字&#xff0c;可以很随意的改变颜色、产生阴影、透明效果、旋转等 兼容性:几乎…

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会…

@controller和@RestController的区别

//controller和RestController的区别:RestController的返回值就是结果被输出在浏览器 //controller的返回值会到resources的templates下找 返回值".html" 页面 1.controller 简单的来说&#xff0c;当我们的返回值需要跳转大另一个页面时候&#xff0c;我们就会使…

Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

环境部署 官网下载Jmeter http://jmeter.apache.org/下载最新版本的 JMeter&#xff0c;解压文件到任意目录 安装JDK&#xff0c;配置Java环境 网上教程很多&#xff0c;这里就不详细介绍了 注意&#xff1a;应该避免JDK安装路径&#xff0c;Jmeter路径有中文和空格 配置…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术&#xff0c;特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底&#xff0c;因此数据分布…

SAC算法

SAC算法 全称Soft Actor-Critic算法&#xff0c;为优化目标引入了熵约束项&#xff0c;增大了动作的探索性&#xff0c;避免陷入局部最优解&#xff0c;原论文 继承了Soft Q-Learning提出了Soft Policy Iteration&#xff0c;进而推导了Soft Actor-Critic参数更新时机&#xff…

YOLOV8改进:TripletAttention | 即插即用的轻量级注意力机制

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 3.涨点效果:TripletAttention,轻量级注意力机…

虹科新闻 | 虹科与LUMATEC正式建立合作伙伴关系

2023年7月&#xff0c;虹科与LUMATEC 正式建立合作伙伴关系&#xff0c;负责该品牌及其产品在大中华地区的销售和售后服务&#xff0c;共同为国内客户提供世界领先的高性能紫外光源产品和先进的液体光导技术。 关于LUMATEC 虹科伙伴LUMATEC公司成立于1976年&#xff08;总部位…

Linux安装nginx教程

目录 一、Nginx下载 二、安装步骤 1、在 /docker目录下新建 nginx 文件夹 2、将解压包移动到nginx目录下并解压到nginx目录 3、进入 nginx目录&#xff0c;找到 configure 4、运行 configure&#xff0c;命令 5、安装 6、查看根目录 7、进入Nginx目录下的conf文件夹…

利用AOSP的开放特点,国产操作系统将如雨后春笋般涌现,反击谷歌

据了解又一款国产操作系统即将诞生&#xff0c;它初期也将利用AOSP开放的特点&#xff0c;兼容安卓应用&#xff0c;由此AOSP将成为国产操作系统发展的基点&#xff0c;不排除有更多国产手机企业站在巨人AOSP的肩膀上发展完全自主操作系统。 这家企业就是小米&#xff0c;早前有…

css实现滚动条一直显示,并且实现滚动条样式的修改

css实现滚动条一直显示&#xff0c;并且实现滚动条样式的修改 自带的滚动条只有当鼠标移上去的时候才会显示&#xff0c;其他时候隐藏&#xff0c;这样用户很难看出这个是能划动的&#xff0c;这就需要滚动条一直显示在页面上&#xff0c;并且需要按照自己一定的样式去修改。 …

22.0 Pycharm中编写js代码

1. 添加Node.js插件 PyCharm是一款主要用于Python开发的集成开发环境(IDE), 对于JavaScript等其他语言的开发支持相对有限. 如果你主要是进行JavaScript开发, 可能会有更适合的IDE, 如Visual Studio Code、WebStorm等.Node.js是一个基于Chrome V8引擎的JavaScript运行环境, 它…

Cpp/Qtday010906cpp基础

目录 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1…

明确企业知识库及知识平台搭建的重要性,开启企业成长之路

在企业运营过程中产生经营数据、管理规范、文化、资料、文档等大量数据&#xff0c;这些数据是花费了大量时间和金钱成本所积累的数据&#xff0c;如果不加以整理总结会造成巨大的浪费。 想要形成结构化、易操作、易利用、易储存、可传承的知识集群&#xff0c;是使用HelpLook在…

异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇

文章目录 概述Spring中对TaskExecutor的抽象Spring框架内置的TaskExecutor实现。SimpleAsyncTaskExecutorSyncTaskExecutorConcurrentTaskExecutorSimpleThreadPoolTaskExecutorThreadPoolTaskExecutorTimerTaskExecutor小结 如何在Spring中使用异步执行使用TaskExecutor实现异…

喜讯 | 智安零信任安全项目入选信通院“安全守卫者计划”优秀案例

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的首届“SecGo云和软件安全大会”成功举办&#xff0c;会上重磅揭晓了“安全守卫者计划 零信任”优秀案例征集活动结果&#xff0c;深圳市智安网络有限公司与大庆油田信息技术公司联合申…

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

Win11怎么显示隐藏文件

为了保护电脑的安全&#xff0c;系统会将一些重要的文件或者文件夹隐藏起来&#xff0c;导致我们无法轻易的找到和打开&#xff0c;那么这些隐藏的文件怎么显示呢&#xff0c;下面小编就给大家带来Win11显示隐藏文件的方法&#xff0c;感兴趣的小伙伴快来和小编一起看看吧。 W…