• 瑞吉外卖 —— 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 版

    1.2.2、Linux 安装 Redis

    1. 解压:
    2. tar -zxvf redis-4.0.0.tar.gz -C /usr/local
    3. 安装gcc:
    4. yum install gcc-c++
    5. 进入redis目录后执行:
    6. [root@localhost redis-4.0.0]# make
    7. 进入src目录后进行安装:
    8. [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 作为配置文件启动后台运行

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

    1.3.3、Windows 启动与停止服务

    双击 redis-server.exe 启动  

    1.3.4、Linux 开启密码校验

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

    将原进程杀掉再启动

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

    设置登陆时同时进行认证

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

    1.3.5、Linux 开启远程连接

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

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

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

    修改完后要重启服务

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

    然后设置防火墙

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

    在 Windows 下再次连接 Linux 的 Redis

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

    2、Redis 数据类型

    中文文档:Redis 教程_redis教程 

    2.1、介绍

    2.2、字符串 String 操作命令

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

    1. 127.0.0.1:6379> set name xiaoming
    2. OK
    3. 127.0.0.1:6379> get name
    4. "xiaoming"
    5. 127.0.0.1:6379> get age
    6. (nil)
    7. 127.0.0.1:6379> set age 20
    8. OK
    9. 127.0.0.1:6379> get age
    10. "20"
    11. 127.0.0.1:6379> set age 30
    12. OK
    13. 127.0.0.1:6379> get age
    14. "30"
    15. 127.0.0.1:6379> setex city 10 beijing
    16. OK
    17. 127.0.0.1:6379> get city
    18. "beijing"
    19. 127.0.0.1:6379> get city
    20. (nil)
    21. 127.0.0.1:6379> setnx k1 v1
    22. (integer) 1
    23. 127.0.0.1:6379> setnx k1 v2
    24. (integer) 0
    25. 127.0.0.1:6379> get k1
    26. "v1"
    27. 127.0.0.1:6379>

    2.3、哈希 hash 操作命令

    1. 127.0.0.1:6379> hset 001 name xiaoming
    2. (integer) 1
    3. 127.0.0.1:6379> hset 001 age 20
    4. (integer) 1
    5. 127.0.0.1:6379> hget 001 name
    6. "xiaoming"
    7. 127.0.0.1:6379> hget 001 age
    8. "20"
    9. 127.0.0.1:6379> hdel 001 age
    10. (integer) 1
    11. 127.0.0.1:6379> hget 001 age
    12. (nil)
    13. 127.0.0.1:6379> hkeys 001
    14. 1) "name"
    15. 127.0.0.1:6379> hset 001 age 30
    16. (integer) 1
    17. 127.0.0.1:6379> hkeys 001
    18. 1) "name"
    19. 2) "age"
    20. 127.0.0.1:6379> hvals 001
    21. 1) "xiaoming"
    22. 2) "30"
    23. 127.0.0.1:6379> hgetall 001
    24. 1) "name"
    25. 2) "xiaoming"
    26. 3) "age"
    27. 4) "30"

    2.4、列表 list 操作命令

    1. 127.0.0.1:6379> lpush list a b c
    2. (integer) 3
    3. 127.0.0.1:6379> lrange list 0 -1
    4. 1) "c"
    5. 2) "b"
    6. 3) "a"
    7. 127.0.0.1:6379> lpush list zhang
    8. (integer) 4
    9. 127.0.0.1:6379> lrange list 0 -1
    10. 1) "zhang"
    11. 2) "c"
    12. 3) "b"
    13. 4) "a"
    14. 127.0.0.1:6379> lpush list a
    15. (integer) 5
    16. 127.0.0.1:6379> lrange list 0 -1
    17. 1) "a"
    18. 2) "zhang"
    19. 3) "c"
    20. 4) "b"
    21. 5) "a"
    22. 127.0.0.1:6379> rpop list
    23. "a"
    24. 127.0.0.1:6379> lrange list 0 -1
    25. 1) "a"
    26. 2) "zhang"
    27. 3) "c"
    28. 4) "b"
    29. 127.0.0.1:6379> llen list
    30. (integer) 4
    31. 127.0.0.1:6379> brpop list 10
    32. 1) "list"
    33. 2) "b"
    34. 127.0.0.1:6379> brpop list 10
    35. 1) "list"
    36. 2) "c"
    37. 127.0.0.1:6379> brpop list 10
    38. 1) "list"
    39. 2) "zhang"
    40. 127.0.0.1:6379> brpop list 10
    41. 1) "list"
    42. 2) "a"
    43. 127.0.0.1:6379> lrange list 0 -1
    44. (empty list or set)
    45. 127.0.0.1:6379> brpop list 10
    46. (nil)
    47. (10.04s)
    48. 127.0.0.1:6379>

    2.5、集合 set 操作命令

    1. 127.0.0.1:6379> sadd set a b c d
    2. (integer) 4
    3. 127.0.0.1:6379> smembers set
    4. 1) "c"
    5. 2) "b"
    6. 3) "a"
    7. 4) "d"
    8. 127.0.0.1:6379> sadd set a d
    9. (integer) 0
    10. 127.0.0.1:6379> smembers set
    11. 1) "a"
    12. 2) "d"
    13. 3) "b"
    14. 4) "c"
    15. 127.0.0.1:6379> scard set
    16. (integer) 4
    17. 127.0.0.1:6379> sadd s a d s o
    18. (integer) 4
    19. 127.0.0.1:6379> smembers s
    20. 1) "a"
    21. 2) "o"
    22. 3) "s"
    23. 4) "d"
    24. 127.0.0.1:6379> sinter set s
    25. 1) "a"
    26. 2) "d"
    27. 127.0.0.1:6379> sunion set s
    28. 1) "b"
    29. 2) "c"
    30. 3) "a"
    31. 4) "d"
    32. 5) "s"
    33. 6) "o"
    34. 127.0.0.1:6379> sdiff set s
    35. 1) "c"
    36. 2) "b"
    37. 127.0.0.1:6379> sdiff s set
    38. 1) "s"
    39. 2) "o"
    40. 127.0.0.1:6379> srem s a b c d
    41. (integer) 2
    42. 127.0.0.1:6379> smembers s
    43. 1) "o"
    44. 2) "s"
    45. 127.0.0.1:6379>

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

    1. 127.0.0.1:6379> zadd sset 10.0 a 9.0 b
    2. (integer) 2
    3. 127.0.0.1:6379> zrange sset 0 -1
    4. 1) "b"
    5. 2) "a"
    6. 127.0.0.1:6379> zadd sset 9.5 c
    7. (integer) 1
    8. 127.0.0.1:6379> zrange sset 0 -1
    9. 1) "b"
    10. 2) "c"
    11. 3) "a"
    12. 127.0.0.1:6379> zrange sset 0 -1 withscores
    13. 1) "b"
    14. 2) "9"
    15. 3) "c"
    16. 4) "9.5"
    17. 5) "a"
    18. 6) "10"
    19. 127.0.0.1:6379> zincrby sset 20 b
    20. "29"
    21. 127.0.0.1:6379> zrange sset 0 -1
    22. 1) "c"
    23. 2) "a"
    24. 3) "b"
    25. 127.0.0.1:6379> zrem sset b
    26. (integer) 1
    27. 127.0.0.1:6379> zrange sset 0 -1
    28. 1) "c"
    29. 2) "a"
    30. 127.0.0.1:6379>

    2.7、通用命令 

    1. 127.0.0.1:6379> keys *
    2. 1) "001"
    3. 2) "sset"
    4. 3) "name"
    5. 4) "k1"
    6. 5) "set"
    7. 6) "age"
    8. 7) "s"
    9. 127.0.0.1:6379> exists name
    10. (integer) 1
    11. 127.0.0.1:6379> exists aaa
    12. (integer) 0
    13. 127.0.0.1:6379> type name
    14. string
    15. 127.0.0.1:6379> type set
    16. set
    17. 127.0.0.1:6379> type sset
    18. zset
    19. 127.0.0.1:6379> ttl name
    20. (integer) -1
    21. 127.0.0.1:6379> setex test 100 zhang
    22. OK
    23. 127.0.0.1:6379> ttl test
    24. (integer) 97
    25. 127.0.0.1:6379> del test
    26. (integer) 1
    27. 127.0.0.1:6379>

    3、在 Java 中操作 Redis

    3.1、介绍

    3.2、Jedis

    Maven 坐标:

    1. <dependency>
    2. <groupId>redis.clientsgroupId>
    3. <artifactId>jedisartifactId>
    4. <version>2.8.0version>
    5. dependency>

    注意,运行前要先启动 Redis 

    使用:

    1. @Test
    2. public void testRedis(){
    3. //1 获取连接,设置服务器ip及端口号
    4. Jedis jedis = new Jedis("localhost",6379);
    5. //2 执行具体的操作
    6. jedis.set("username","xiaoming");
    7. String value = jedis.get("username");
    8. System.out.println(value);
    9. jedis.hset("myhash","addr","bj");
    10. String hValue = jedis.hget("myhash", "addr");
    11. System.out.println(hValue);
    12. Set keys = jedis.keys("*");
    13. for (String key : keys) {
    14. System.out.println(key);
    15. }
    16. jedis.del("username","myhash");
    17. //3 关闭连接
    18. jedis.close();
    19. }

    3.3、Spring Data Redis

    3.3.1、依赖 

    Maven 坐标:

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>

    3.3.2、RedisTemplate

    3.3.3、application.yml

    1. spring:
    2. application:
    3. name: springdataredis_demo
    4. #Redis相关配置
    5. redis:
    6. host: localhost # 连接ip
    7. port: 6379 # 端口
    8. #password: 123456 #密码
    9. database: 0 #操作的是0号数据库
    10. jedis:
    11. #Redis连接池配置
    12. pool:
    13. max-active: 8 #最大连接数
    14. max-wait: 1ms #连接池最大阻塞等待时间
    15. max-idle: 4 #连接池中的最大空闲连接
    16. 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 无需更换系列化器,因为从代码获取时会自动反序列化 

    1. @Configuration
    2. public class RedisConfig extends CachingConfigurerSupport {
    3. @Bean
    4. public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
    5. RedisTemplate redisTemplate = new RedisTemplate<>();
    6. //默认的Key序列化器为:JdkSerializationRedisSerializer
    7. redisTemplate.setKeySerializer(new StringRedisSerializer());
    8. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    9. redisTemplate.setConnectionFactory(connectionFactory);
    10. return redisTemplate;
    11. }
    12. }

    3.3.5、测试

    1. @SpringBootTest
    2. @RunWith(SpringRunner.class)
    3. public class SpringDataRedisTest {
    4. @Autowired
    5. private RedisTemplate redisTemplate;
    6. /**
    7. * 操作String类型数据
    8. */
    9. @Test
    10. public void testString(){
    11. redisTemplate.opsForValue().set("city123","beijing");
    12. String value = (String) redisTemplate.opsForValue().get("city123");
    13. System.out.println(value);
    14. // 设置超时时间
    15. redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
    16. Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
    17. System.out.println(aBoolean);
    18. redisTemplate.delete("city123");
    19. redisTemplate.delete("city1234");
    20. redisTemplate.delete("key1");
    21. }
    22. /**
    23. * 操作Hash类型数据
    24. */
    25. @Test
    26. public void testHash(){
    27. HashOperations hashOperations = redisTemplate.opsForHash();
    28. //存值
    29. hashOperations.put("002","name","xiaoming");
    30. hashOperations.put("002","age","20");
    31. hashOperations.put("002","address","bj");
    32. //取值
    33. String age = (String) hashOperations.get("002", "age");
    34. System.out.println(age);
    35. //获得hash结构中的所有字段
    36. Set keys = hashOperations.keys("002");
    37. for (Object key : keys) {
    38. System.out.println(key);
    39. }
    40. //获得hash结构中的所有值
    41. List values = hashOperations.values("002");
    42. for (Object value : values) {
    43. System.out.println(value);
    44. }
    45. redisTemplate.delete("002");
    46. }
    47. /**
    48. * 操作List类型的数据
    49. */
    50. @Test
    51. public void testList(){
    52. ListOperations listOperations = redisTemplate.opsForList();
    53. //存值
    54. listOperations.leftPush("mylist","a");
    55. listOperations.leftPushAll("mylist","b","c","d");
    56. //取值
    57. List mylist = listOperations.range("mylist", 0, -1);
    58. for (String value : mylist) {
    59. System.out.println(value);
    60. }
    61. //获得列表长度 llen
    62. Long size = listOperations.size("mylist");
    63. int lSize = size.intValue();
    64. for (int i = 0; i < lSize; i++) {
    65. //出队列
    66. String element = (String) listOperations.rightPop("mylist");
    67. System.out.println(element);
    68. }
    69. redisTemplate.delete("mylist");
    70. }
    71. /**
    72. * 操作Set类型的数据
    73. */
    74. @Test
    75. public void testSet(){
    76. SetOperations setOperations = redisTemplate.opsForSet();
    77. //存值
    78. setOperations.add("myset","a","b","c","a");
    79. //取值
    80. Set myset = setOperations.members("myset");
    81. for (String o : myset) {
    82. System.out.println(o);
    83. }
    84. //删除成员
    85. setOperations.remove("myset","a","b");
    86. //取值
    87. myset = setOperations.members("myset");
    88. for (String o : myset) {
    89. System.out.println(o);
    90. }
    91. redisTemplate.delete("myset");
    92. }
    93. /**
    94. * 操作ZSet类型的数据
    95. */
    96. @Test
    97. public void testZset(){
    98. ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    99. //存值
    100. zSetOperations.add("myZset","a",10.0);
    101. zSetOperations.add("myZset","b",11.0);
    102. zSetOperations.add("myZset","c",12.0);
    103. zSetOperations.add("myZset","a",13.0);
    104. //取值
    105. Set myZset = zSetOperations.range("myZset", 0, -1);
    106. for (String s : myZset) {
    107. System.out.println(s);
    108. }
    109. System.out.println("------------------------------");
    110. //修改分数
    111. zSetOperations.incrementScore("myZset","b",20.0);
    112. //取值
    113. myZset = zSetOperations.range("myZset", 0, -1);
    114. for (String s : myZset) {
    115. System.out.println(s);
    116. }
    117. System.out.println("------------------------------");
    118. //删除成员
    119. zSetOperations.remove("myZset","a","b");
    120. //取值
    121. myZset = zSetOperations.range("myZset", 0, -1);
    122. for (String s : myZset) {
    123. System.out.println(s);
    124. }
    125. redisTemplate.delete("myZset");
    126. }
    127. /**
    128. * 通用操作,针对不同的数据类型都可以操作
    129. */
    130. @Test
    131. public void testCommon(){
    132. //获取Redis中所有的key
    133. Set keys = redisTemplate.keys("*");
    134. for (String key : keys) {
    135. System.out.println(key);
    136. }
    137. //判断某个key是否存在
    138. Boolean itcast = redisTemplate.hasKey("itcast");
    139. System.out.println(itcast);
    140. //删除指定key
    141. redisTemplate.delete("myZset");
    142. //获取指定key对应的value的数据类型
    143. DataType dataType = redisTemplate.type("myset");
    144. System.out.println(dataType.name());
    145. }
    146. }

  • 相关阅读:
    15天深度复习JavaWeb的详细笔记(五)——JavaScript
    Servlet | Servlet原理、开发第一个带有Java小程序Servlet
    Excel VBA高级编程-微信群发(支持发送文件)
    【http协议】Content-Type 超详细介绍
    计算机毕业设计asp.net社团人员信息系统VS开发sqlserver数据库web结构c#编程计算机网页项目
    Python web 框架对比:Flask vs Django
    python实现对简单的运算型验证码的识别【不使用OpenCV】
    Evaluation Metrics in the Era of GPT-4
    桶装水水厂送水小程序开发
    温湿度监测技术又进化了,这个操作太牛了!
  • 原文地址:https://blog.csdn.net/Mr_zhangyj/article/details/126794326