当前位置: 首页 > news >正文

瑞吉外卖 —— 10、Redis

目录

1、Redis 入门

1.1、Redis 简介

1.2、下载与安装

1.2.1、下载 

1.2.2、Linux 安装 Redis

1.2.3、Windows 安装 Redis

1.3、服务启动与停止

1.3.1、Linux 启动与停止

1.3.2、Linux 设置服务后台运行

1.3.3、Windows 启动与停止服务

1.3.4、Linux 开启密码校验

1.3.5、Linux 开启远程连接

2、Redis 数据类型

2.1、介绍

2.2、字符串 String 操作命令

2.3、哈希 hash 操作命令

2.4、列表 list 操作命令

2.5、集合 set 操作命令

2.6、有序集合 sorted set 操作命令

2.7、通用命令 

3、在 Java 中操作 Redis

3.1、介绍

3.2、Jedis

3.3、Spring Data Redis

3.3.1、依赖 

3.3.2、RedisTemplate 类

3.3.3、application.yml

3.3.4、设置 RedisTemplate 的序列化器

3.3.5、测试


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

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、咨询、新闻)

1、Redis 入门

官网:Redis

1.1、Redis 简介

The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

开源内存数据存储,被数百万开发人员用作数据库、缓存、流引擎和消息代理。

Redis 是用 C 语言开发的一个开源的高性能键值对 (key-value) 数据库,官方提供的数据是可以达到 100000+ 的 QPS(每秒内查询次数)。它存储的 value 类型比较丰富,也被称为结构化的 NoSql 数据库。

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

关系型数据库(RDBMS):MySQL、Oracl、DB2、SQLServer

非关系型数据库(NoSQL):Redis、Mongo db、MemCached

Redis 应用场景:缓存、任务队列、消息队列、分布式锁

1.2、下载与安装

1.2.1、下载 

Redis 安装包分为 Windows 版和 Linux 版

  • Windows 版:https://github.com/microsoftarchive/redis/releases
  • Linux 版:Index of /releases/

1.2.2、Linux 安装 Redis

解压:
tar -zxvf redis-4.0.0.tar.gz -C /usr/local

安装gcc:
yum install gcc-c++

进入redis目录后执行:
[root@localhost redis-4.0.0]# make

进入src目录后进行安装:
[root@localhost src]# make install

1.2.3、Windows 安装 Redis

Redis 的 windows 版属于绿色软件,直接解压即可使用,解压后目录结构如下:

1.3、服务启动与停止

1.3.1、Linux 启动与停止

进入 src 目录后执行

./redis-server

1.3.2、Linux 设置服务后台运行

进入 根目录 下修改 redis.conf 文件

输入 /dae 查找,然后将 daemonize 改为 yes,即后台运行

在根目录以 redis.conf 作为配置文件启动后台运行

[root@localhost redis-4.0.0]# src/redis-server ./redis.conf 
25973:C 10 Sep 12:52:39.424 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
25973:C 10 Sep 12:52:39.424 # Redis version=4.0.0, bits=64, commit=00000000, modified=0, pid=25973, just started
25973:C 10 Sep 12:52:39.424 # Configuration loaded

1.3.3、Windows 启动与停止服务

双击 redis-server.exe 启动  

1.3.4、Linux 开启密码校验

修改 redis-conf,将 requirepass 这行的注解去掉,并指定密码

将原进程杀掉再启动

[root@localhost redis-4.0.0]# ps -ef | grep redis
root      25974      1  0 12:52 ?        00:00:01 src/redis-server 127.0.0.1:6379
root      35559  27196  0 11:02 pts/2    00:00:00 ./redis-cli
root      70343   1289  0 13:12 pts/0    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.0]# kill -9 25974
[root@localhost redis-4.0.0]# ps -ef | grep redis
root      35559  27196  0 11:02 pts/2    00:00:00 ./redis-cli
root      71526   1289  0 13:12 pts/0    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.0]# kill -9 35559
[root@localhost redis-4.0.0]# ps -ef | grep redis
root      72270   1289  0 13:13 pts/0    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.0]# src/redis-server ./redis.conf 
74266:C 10 Sep 13:13:58.154 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
74266:C 10 Sep 13:13:58.154 # Redis version=4.0.0, bits=64, commit=00000000, modified=0, pid=74266, just started
74266:C 10 Sep 13:13:58.154 # Configuration loaded
[root@localhost redis-4.0.0]# src/redis-cli -h localhost -p 6379
localhost:6379> keys *
(error) NOAUTH Authentication required.
localhost:6379> auth 密码
OK

设置登陆时同时进行认证

[root@localhost redis-4.0.0]# src/redis-cli -h localhost -p 6379 -a 密码
localhost:6379> keys *
(empty list or set)

1.3.5、Linux 开启远程连接

再没有开启远程连接前,再 Windows 下连接 Linux 的 Redis

PS D:\redis\Redis-x64-3.2.100> ./redis-cli.exe -h 192.168.44.128 -p 6379 -a 密码                                     
Could not connect to Redis at 192.168.44.128:6379: 由于目标计算机积极拒绝,无法连接。                                  
Could not connect to Redis at 192.168.44.128:6379: 由于目标计算机积极拒绝,无法连接。

需要再 Linux 下修改 redis.conf 配置文件,将下图改行注释

修改完后要重启服务

[root@localhost redis-4.0.0]# ps -ef | grep redis
root       2650      1  0 10:25 ?        00:00:00 src/redis-server 127.0.0.1:6379
root      16456   1290  0 10:37 pts/0    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.0]# kill -9  2650
[root@localhost redis-4.0.0]# ps -ef | grep redis
root      16785   1290  0 10:37 pts/0    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.0]# src/redis-server ./redis.conf 
17142:C 11 Sep 10:38:10.099 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17142:C 11 Sep 10:38:10.099 # Redis version=4.0.0, bits=64, commit=00000000, modified=0, pid=17142, just started
17142:C 11 Sep 10:38:10.099 # Configuration loaded

然后设置防火墙

[root@localhost redis-4.0.0]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
[root@localhost redis-4.0.0]# firewall-cmd --reload
success

在 Windows 下再次连接 Linux 的 Redis

PS D:\redis\Redis-x64-3.2.100> ./redis-cli.exe -h 192.168.44.128 -p 6379 -a 密码                                     
192.168.44.128:6379> keys *                                                                                            
(empty list or set)

2、Redis 数据类型

中文文档:Redis 教程_redis教程 

2.1、介绍

2.2、字符串 String 操作命令

更多命令:Redis 字符串(String)_redis教程 

127.0.0.1:6379> set name xiaoming
OK
127.0.0.1:6379> get name
"xiaoming"
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> set age 30
OK
127.0.0.1:6379> get age
"30"
127.0.0.1:6379> setex city 10 beijing
OK
127.0.0.1:6379> get city
"beijing"
127.0.0.1:6379> get city
(nil)
127.0.0.1:6379> setnx k1 v1
(integer) 1
127.0.0.1:6379> setnx k1 v2
(integer) 0
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>

2.3、哈希 hash 操作命令

127.0.0.1:6379> hset 001 name xiaoming
(integer) 1
127.0.0.1:6379> hset 001 age 20
(integer) 1
127.0.0.1:6379> hget 001 name
"xiaoming"
127.0.0.1:6379> hget 001 age
"20"
127.0.0.1:6379> hdel 001 age
(integer) 1
127.0.0.1:6379> hget 001 age
(nil)
127.0.0.1:6379> hkeys 001
1) "name"
127.0.0.1:6379> hset 001 age 30
(integer) 1
127.0.0.1:6379> hkeys 001
1) "name"
2) "age"
127.0.0.1:6379> hvals 001
1) "xiaoming"
2) "30"
127.0.0.1:6379> hgetall 001
1) "name"
2) "xiaoming"
3) "age"
4) "30"

2.4、列表 list 操作命令

127.0.0.1:6379> lpush list a b c
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpush list zhang
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "zhang"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lpush list a
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "zhang"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpop list
"a"
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "zhang"
3) "c"
4) "b"
127.0.0.1:6379> llen list
(integer) 4
127.0.0.1:6379> brpop list 10
1) "list"
2) "b"
127.0.0.1:6379> brpop list 10
1) "list"
2) "c"
127.0.0.1:6379> brpop list 10
1) "list"
2) "zhang"
127.0.0.1:6379> brpop list 10
1) "list"
2) "a"
127.0.0.1:6379> lrange list 0 -1
(empty list or set)
127.0.0.1:6379> brpop list 10
(nil)
(10.04s)
127.0.0.1:6379>

2.5、集合 set 操作命令

127.0.0.1:6379> sadd set a b c d
(integer) 4
127.0.0.1:6379> smembers set
1) "c"
2) "b"
3) "a"
4) "d"
127.0.0.1:6379> sadd set a d
(integer) 0
127.0.0.1:6379> smembers set
1) "a"
2) "d"
3) "b"
4) "c"
127.0.0.1:6379> scard set
(integer) 4
127.0.0.1:6379> sadd s a d s o
(integer) 4
127.0.0.1:6379> smembers s
1) "a"
2) "o"
3) "s"
4) "d"
127.0.0.1:6379> sinter set s
1) "a"
2) "d"
127.0.0.1:6379> sunion set s
1) "b"
2) "c"
3) "a"
4) "d"
5) "s"
6) "o"
127.0.0.1:6379> sdiff set s
1) "c"
2) "b"
127.0.0.1:6379> sdiff s set
1) "s"
2) "o"
127.0.0.1:6379> srem s a b c d
(integer) 2
127.0.0.1:6379> smembers s
1) "o"
2) "s"
127.0.0.1:6379>

2.6、有序集合 sorted set 操作命令

127.0.0.1:6379> zadd sset 10.0 a 9.0 b
(integer) 2
127.0.0.1:6379> zrange sset 0 -1
1) "b"
2) "a"
127.0.0.1:6379> zadd sset 9.5 c
(integer) 1
127.0.0.1:6379> zrange sset 0 -1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> zrange sset 0 -1 withscores
1) "b"
2) "9"
3) "c"
4) "9.5"
5) "a"
6) "10"
127.0.0.1:6379> zincrby sset 20 b
"29"
127.0.0.1:6379> zrange sset 0 -1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrem sset b
(integer) 1
127.0.0.1:6379> zrange sset 0 -1
1) "c"
2) "a"
127.0.0.1:6379>

2.7、通用命令 

127.0.0.1:6379> keys *
1) "001"
2) "sset"
3) "name"
4) "k1"
5) "set"
6) "age"
7) "s"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists aaa
(integer) 0
127.0.0.1:6379> type name
string
127.0.0.1:6379> type set
set
127.0.0.1:6379> type sset
zset
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> setex test 100 zhang
OK
127.0.0.1:6379> ttl test
(integer) 97
127.0.0.1:6379> del test
(integer) 1
127.0.0.1:6379>

3、在 Java 中操作 Redis

3.1、介绍

3.2、Jedis

Maven 坐标:

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

注意,运行前要先启动 Redis 

使用:

    @Test
    public void testRedis(){
        //1 获取连接,设置服务器ip及端口号
        Jedis jedis = new Jedis("localhost",6379);
        
        //2 执行具体的操作
        jedis.set("username","xiaoming");

        String value = jedis.get("username");
        System.out.println(value);


        jedis.hset("myhash","addr","bj");
        String hValue = jedis.hget("myhash", "addr");
        System.out.println(hValue);

        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        jedis.del("username","myhash");

        //3 关闭连接
        jedis.close();
    }

3.3、Spring Data Redis

3.3.1、依赖 

Maven 坐标:

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

3.3.2、RedisTemplate 类

3.3.3、application.yml

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

3.3.4、设置 RedisTemplate 的序列化器

RedisTemplate 默认的Key序列化器为:JdkSerializationRedisSerializer,在执行下面这行代码后

redisTemplate.opsForValue().set("city123","beijing");

在数据库中的键如下

127.0.0.1:6379> keys *                                                                                                  1) "\xac\xed\x00\x05t\x00\acity123"

为了避免这种情况,需要设置其序列化器

一般来说 Value 无需更换系列化器,因为从代码获取时会自动反序列化 

@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;
    }

}

3.3.5、测试

@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);

        redisTemplate.delete("city123");
        redisTemplate.delete("city1234");
        redisTemplate.delete("key1");
    }

    /**
     * 操作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);
        }

        redisTemplate.delete("002");
    }

    /**
     * 操作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);
        }

        redisTemplate.delete("mylist");
    }

    /**
     * 操作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);
        }

        redisTemplate.delete("myset");
    }

    /**
     * 操作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);
        }

        System.out.println("------------------------------");

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

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

        System.out.println("------------------------------");

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

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

        redisTemplate.delete("myZset");
    }

    /**
     * 通用操作,针对不同的数据类型都可以操作
     */
    @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());

    }
}

相关文章:

  • 信息安全技术实验:网络嗅探与欺骗
  • 【SQL刷题】DAY15----SQL联结表专项练习
  • Python基础学习
  • 2021了,真的不要再说 Node.js 是一门编程语言了
  • shell 编程之变量总结
  • [Mybatis-Plus笔记] MybatisPlus-03-QueryWrapper条件构造器
  • STM32F1定时器-PWM输出
  • CNN天气识别
  • 基于SpringBoot+Vue的校园招聘管理系统(Java毕业设计)
  • java File类基本概念基本构造方法使用
  • 基于Java微服务方案的商品秒杀系统
  • 谷粒商城 高级篇(一) --------- ElasticSearch 的简介与安装
  • mybatis的sql标签
  • 面试题-参加生日宴会的最多人数
  • 开发运维-常用远程桌面开源软件
  • (三)从jvm层面了解线程的启动和停止
  • 2017-08-04 前端日报
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • JavaScript实现分页效果
  • nfs客户端进程变D,延伸linux的lock
  • python_bomb----数据类型总结
  • React Native移动开发实战-3-实现页面间的数据传递
  • ubuntu 下nginx安装 并支持https协议
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 计算机常识 - 收藏集 - 掘金
  • 利用jquery编写加法运算验证码
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ionic异常记录
  • PostgreSQL之连接数修改
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​学习一下,什么是预包装食品?​
  • (2)STL算法之元素计数
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (js)循环条件满足时终止循环
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (层次遍历)104. 二叉树的最大深度
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三)模仿学习-Action数据的模仿
  • (转)为C# Windows服务添加安装程序
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2016.7 day.5] T2
  • [AIGC] MySQL存储引擎详解
  • [Android]使用Retrofit进行网络请求
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体