Redis学习(一)

Nosql概述

Nosql特点

  • 易扩展(数据之间没有关系,很好扩展);
  • 大数据量高性能(Redis 写8w次/s,读取11w/次);
  • 数据类型是多样性的;
  • 传统RDBMS 和Nosql:
传统的RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中
- 数据定义语言;
- 严格一致性
- 基础事务
Nosql
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储、列存储、文档存储、图形数据库(社交关系);
- 最终一致性;
- CAP定理 和 BASE (异地多活)

NoSQL的四大分类

  • KV键值对
    Redis、Tair、Memcache;
  • 文档型数据库(bson格式):
    MongoDB:基于分布式文件存储的数据库;
    ConthDB
  • 列存储数据库
    HBase
    分布式文件系统
  • 图关系数据

Redis入门

概述

Redis(Remote Dictionary Server,远程字典服务),是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis能干嘛

1、内存存储、持久化(内存是断电即失的,RDB,AOF);
2、效率高,可以用于高速缓存;
3、发布-订阅系统;
4、地图信息分析;
5、计时器、计数器(浏览量);

特性:
1、多样的数据类型;
2、持久化;
3、集群;
4、事务;

Redis的Linux安装步骤

1、下载Redis tar包: https://redis.io/
2、

tar -zxvf redis-6.2.1.tar.gz

在这里插入图片描述
3、进入解压后的文件,可以看到Redis的配置文件
在这里插入图片描述
4、基本的环境安装

yum install gcc-c++ -y
yum install tcl
gcc -v
make
make install

执行完之后:
在这里插入图片描述
5、Redis的默认安装路径:/usr/local/bin
在这里插入图片描述
6、将Redis配置文件,复制到当前目录下

[root@localhost bin]# mkdir rconfig
[root@localhost bin]# cp /opt/redis-6.2.1/redis.conf rconfig/
[root@localhost bin]# cd rconfig/
[root@localhost rconfig]# ls
redis.conf

在这里插入图片描述
7、redis默认不是后台启动的,修改配置文件!
改成yes
在这里插入图片描述
8、启动Redis服务
进入/usr/local/bin
在这里插入图片描述
9、连接redis服务
在这里插入图片描述
keys * :查看所有key

10、如何关闭Redis服务
在这里插入图片描述
11、先试用单机多Redis启动集群测试!

测试性能

redis-benchmark是一个压力测试工具,官方自带的性能测试工具。

简单测试下,100个并发连接,100000个请求:
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

Redis基础知识

  • Redis默认有16个数据库;
  • 默认使用的是第0个
    • 可以用select进行切换数据库
    • keys * : 查看当前数据库所有key
    • 清空当前数据库:flushdb
    • 清空所有数据库:flushall;
  • Redis是单线程的:
    Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就是用单线程了;
    • Redis为什么单线程还这么快?
      误区1:高性能的服务器不一定是单线程的;
      误区2:多线程(CPU上下文切换)一定不比单线程效率高的;
      核心:Redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率是最高的,多线程的CPU上下文会切换,对于内存系统来说,如果没有上下文切换效率是最高的;

Redis数据类型

五大数据类型

Redis-Key
127.0.0.1:6379> set name qinjiang # set key
OK
127.0.0.1:6379> keys * # 查看所有key
1) "age"
2) "name"
127.0.0.1:6379> clear
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"qinjiang"
127.0.0.1:6379> EXPIRE name 10  #设置key的过期时间
(integer) 1
127.0.0.1:6379> EXPIRE name 10
(integer) 1
127.0.0.1:6379> get name
"qinjiang"
127.0.0.1:6379> ttl name #查看key何时过期
(integer) 4
127.0.0.1:6379> type name #查看当前key的类型
string
String(字符串)
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 #查看key的值
"v1"
127.0.0.1:6379> keys * #获取所有key
1) "key1"
2) "age"
3) "name"
127.0.0.1:6379> EXISTS key1 # 判断某个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" # 在key1的value后面追加字符串,如果key不存在,相当于set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 # 获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 ",vleus"
(integer) 13
127.0.0.1:6379> get key1
"v1hello,vleus"
#######################################################
redis设置步长:incr 自增
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> type views
string
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views # 自增1
(integer) 1
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> type views
string
127.0.0.1:6379> DECR views # 自减1
(integer) 1
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCRBY views 10 #自增且设置步长
(integer) 10
127.0.0.1:6379> INCRBY views 10
(integer) 20
########################################################
字符串范围 range
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 "hello,redis"
OK
127.0.0.1:6379> get key1
"hello,redis"
127.0.0.1:6379> GETRANGE 0 3 
(error) ERR wrong number of arguments for 'getrange' command
127.0.0.1:6379> GETRANGE key1 0 3 #获取某个key的字符串左闭右闭位置的数据
"hell"
127.0.0.1:6379> GETRANGE key1 0 4
"hello"
127.0.0.1:6379> GETRANGE key1 0 -1 # 0到-1获取整个字符串的值
"hello,redis"
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
########################################################
setex(set with expire): 设置过期时间
setnx(set if not exist) : 不存在则设置,分布式锁中会常常使用
127.0.0.1:6379> setex key3 30 "hello" # 设置key3的值是hello,30s之后过期
OK
127.0.0.1:6379> ttl key3
(integer) 28
127.0.0.1:6379> ttl key3
(integer) 27
127.0.0.1:6379> setnx mykey "redis" #若mykey不存在,则创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "mongodb" #若mykey存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
##########################################
mset:批量设置值
mget:批量获取值
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "key3"
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "key3"
127.0.0.1:6379> mget key1 key2 key3 #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx key1 v1 key2 v2 key3 v3 key4 v4 # msetnx 是一个原子性的操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> get key4
(nil)

# 对象,这里的key是一个巧妙的设计,user:id:field value
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "18"
##########################################
getset: 先get再set
127.0.0.1:6379> getset db redis #get时候不存在值,则返回null,再设置值
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mysql #get时候获取到的是旧值,再设置key为新值
"redis"
127.0.0.1:6379> get db
"mysql"

String类型的使用场景:

  • 计数器;
  • 统计数量;
  • 对象缓存存储;
List
  • 在redis里边,可以吧list玩成栈、队列、阻塞队列;
  • 所有的list命令都是l开头;
############################
list中插入元素
127.0.0.1:6379> lpush list one # 将一个值或者多个值插入到列表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 # 获取list中的所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 # 获取指定区间内的值,左闭右闭区间
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list right # 将一个值或者多个值插入到列表的尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE 0 -1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
###############################################
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list # 移除list的第一个元素
"three"
127.0.0.1:6379> rpop list # 移除list的最后一个元素
"right"
127.0.0.1:6379> LRANGE 0 -1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE key 0 -1
(empty array)
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
#########################################
127.0.0.1:6379> LINDEX list 1 # 通过下标获得list中的某一个值
"one"
127.0.0.1:6379> LINDEX list -1
"one"
#########################################
llen 获取list长度
127.0.0.1:6379> LPUSH list one
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LLEN list # 返回列表的长度
(integer) 3
##########################################
移除指定的值
 127.0.0.1:6379> LREM list 1 one # 移除list集合中指定个数value,精确匹配
(integer) 1
127.0.0.1:6379> lrange 0 -1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "two"
##############################################
trim 修剪: list截断
127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist hello1
(integer) 2
127.0.0.1:6379> rpush mylist hello2
(integer) 3
127.0.0.1:6379> rpush mylist hello3
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定的长度
OK
127.0.0.1:6379> lrange mylist
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
##############################################
rpoplpush:移除列表中的最后一个元素,并且将它移动到新的列表中
127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist hello1
(integer) 2
127.0.0.1:6379> rpush mylist hello2
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist # 移除列表中的最后一个元素,并且将它移动到新的列表中
"hello2"
127.0.0.1:6379> LRANGE mylist 0 -1 # 查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> LRANGE myotherlist 0 -1 # 查看目标列表
1) "hello2"

##########################################
lset key index element: 在指定list的位置更新某个值
127.0.0.1:6379> EXISTS list
(integer) 0
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lset list 0 item # 如果key存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 0

  1. “item”
    127.0.0.1:6379> lrange list 0 -1
  2. “item”
    ##########################################
    linsert: 在指定位置插入数据
Set(集合)
  • Set中的值是不能重复的
#############################
127.0.0.1:6379> sadd myset hello # set 集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset bilibili
(integer) 1
127.0.0.1:6379> sadd myset lol
(integer) 1
127.0.0.1:6379> SMEMBERS myset # 查看指定set的所有值
1) "lol"
2) "bilibili"
3) "hello"
127.0.0.1:6379> SISMEMBER myset lol # 判断某一个值是否在set集合中
(integer) 1
127.0.0.1:6379> SISMEMBER myset dota
(integer) 0
##################################
127.0.0.1:6379> SCARD myset # 获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379> SREM myset hello # 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> SCARD myset
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "lol"
2) "bilibili"
############################################
set 无序不重复集合,抽随机
127.0.0.1:6379> SRANDMEMBER myset # 随机抽选出一个元素
"lol"
127.0.0.1:6379> SRANDMEMBER myset
"lol2"
127.0.0.1:6379> SRANDMEMBER myset
"lol2"
127.0.0.1:6379> SRANDMEMBER myset
"lol"
127.0.0.1:6379> SRANDMEMBER myset
"lol2"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽选出指定个数的元素
1) "lol"
2) "lol2"
127.0.0.1:6379> SRANDMEMBER myset 3
1) "lol"
2) "bilibili"
3) "lol2"
###############################################
* 删除指定的key
* 随机删除key
127.0.0.1:6379> SMEMBERS myset
1) "lol"
2) "bilibili"
3) "lol2"
127.0.0.1:6379> spop myset  # 随机删除一些set集合中的元素
"lol"
127.0.0.1:6379> spop myset
"lol2"
127.0.0.1:6379> SMEMBERS myset
1) "bilibili"
####################################
讲一个指定的值,移动到另外一个set集合
127.0.0.1:6379> sadd mset hello
(integer) 1
127.0.0.1:6379> sadd mset world
(integer) 1
127.0.0.1:6379> sadd myset kuangshen
(integer) 1
127.0.0.1:6379> sadd myset set2
(integer) 1
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 kuangshen
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "set2"
2) "kuangshen"
##########################################
微博、B站的共同关注(取的交集)
Redis的set集合关系
- 取差集:SDIFF
- 取交集:   SINTER
- 取并集:   SUNION
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1
(error) ERR wrong number of arguments for 'sadd' command
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SMEMBERS key1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> SMEMBERS key2
1) "d"
2) "e"
3) "c"
127.0.0.1:6379> sdiff key1 key2 # 差集
1) "b"
2) "a"
127.0.0.1:6379> SINTER key1 key2 # 交集
1) "c"
127.0.0.1:6379> SUNION key1 key2 # 并集
1) "c"
2) "a"
3) "d"
4) "b"
5) "e"
127.0.0.1:6379> sdiff key2 key1
1) "d"
2) "e"
######################################
微博:A用户将所有关注的人放在一个set集合中,将它的粉丝也放在一个集合中
共同关注,共同爱好,二度好友
Hash(哈希)
  • Map集合,key-map,值是一个map集合
  • 本质是和String类型没有太大区别,还是一个简单的key-value
127.0.0.1:6379> hset myhash field1 kuangshen # set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> mget hash field1 # 获取一个字段值
1) (nil)
2) (nil)
127.0.0.1:6379> hget myhash field1
"kuangshen"
127.0.0.1:6379> hmset myhash field2 lol field3 dnf field4 cf # 同时set多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值
1) "kuangshen"
2) "lol"
127.0.0.1:6379> hgetall myhash #获取全部的数据
1) "field1"
2) "kuangshen"
3) "field2"
4) "lol"
5) "field3"
6) "dnf"
7) "field4"
8) "cf"
###########################################
hel : 删除hash指定的key字段
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "lol"
3) "field3"
4) "dnf"
5) "field4"
6) "cf"
###########################################
hlen: 获取hash表的字段数量
127.0.0.1:6379> hlen myhash
(integer) 3
########################################
127.0.0.1:6379> HEXISTS myhash field1 # 判断hash中的指定字段是否存在
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3
(integer) 1
##########################################
# 只获取所有field
# 只获取所有value
127.0.0.1:6379> hkeys myhash # 只获取所有field
1) "field2"
2) "field3"
3) "field4"
127.0.0.1:6379> HVALS myhash # 只获取所有value
1) "lol"
2) "dnf"
3) "cf"
############################################
incr decr
127.0.0.1:6379> HINCRBY myhash field3 1 # 指定增量
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field5 hello # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field5 world # 如果不存在则不能设置
(integer) 0
############################################
hash变更的数据 user name age
hash更适合于对象的存储,String更适合字符串存储

Zset(有序集合)
在set的基础上,增加了一个值

127.0.0.1:6379> zadd myset 1 one # 向zset中增加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 three
(integer) 1
127.0.0.1:6379> ZRANGE myset 0 -1 # 获取对应zset中的所有值
1) "one"
2) "two"
3) "three"
#################################################
排序如何实现
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 3000 xiaogang
(integer) 1
127.0.0.1:6379> zadd salary 500 xi
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "xi"
2) "xiaohong"
3) "xiaogang"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部的用户并且附带成绩
1) "xi"
2) "500"
3) "xiaohong"
4) "2500"
5) "xiaogang"
6) "3000"
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores # 按照score降序排列数据
1) "xiaogang"
2) "3000"
3) "xiaohong"
4) "2500"
############################
移除zset中的元素
127.0.0.1:6379> zrange salary 0 -1
1) "xi"
2) "xiaohong"
3) "xiaogang"
127.0.0.1:6379> zrem salary xi # 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohong"
2) "xiaogang"
127.0.0.1:6379> ZCARD salary # 获取有序集合中的个数
(integer) 2
#########################################
127.0.0.1:6379> zadd myzset 1 hello
(integer) 1
127.0.0.1:6379> zadd myzset 2 world 3 vleus
(integer) 2
127.0.0.1:6379> zount myzset 1 3
(error) ERR unknown command `zount`, with args beginning with: `myzset`, `1`, `3`, 
127.0.0.1:6379> ZCOUNT myzset 1 3 # 获取指定闭区间之间的元素数量
(integer) 3

三种特殊数据类型

geospatial 地理位置

朋友的定位、附近的人、打车距离计算;
六个命令

geoadd
## 参数: key 值(经度 纬度 城市)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
geopos
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
127.0.0.1:6379> GEOPOS china:city beijing chongqing # 获取指定城市的经度和纬度
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
geodist 返回两个给定位置之间的距离

单位如下:

  • m单位表示为米;
  • km表示单位为千米;
  • mi表示单位为英里;
  • ft表示单位为英尺;
127.0.0.1:6379> GEODIST china:city beijing chongqing km
"1464.0708"
127.0.0.1:6379> GEODIST china:city beijing shanghai km
"1067.3788"
georadius 查询当前位置附近的人

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 获取以当前经纬度为中心寻找方圆1000km以内的key中包含的城市

  1. “chongqing”
  2. “xian”
  3. “shenzhen”
  4. “hangzhou”
GEORADIUSBYMEMBER
# 找出位于指定元素周围的其他元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
geohash 将二维的经纬度转换成11位的hash字符串
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
Hperloglog

什么是基数?
基数:一个数据集内不重复的元素个数

127.0.0.1:6379> PFADD myset mykey a b c d e f g h i j
(integer) 1
127.0.0.1:6379> pfcount myset
(integer) 11
Bitmaps

位存储

统计用户信息、活跃/不活跃、登录/未登录、打卡/未打卡;
比如使用bitmap来记录周一到周日的打卡:

127.0.0.1:6379> setbit sign 0 1 # 插入
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
.127.0.0.1:6379> getbit sign 2 # 获取
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> bitcount sign # 获取key中的打卡记录(为1的数字)
(integer) 3

周一:1;周二:0;周三:1;周四:1;周五:1;周六:0;周日:0;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于学习Spring Boot和Redis的组合,你可以按照以下步骤进行: 1. 首先,确保你对Spring Boot有一定的了解。如果你对Spring Boot还不熟悉,可以先学习一些基础知识,比如Spring框架、依赖注入和控制反转等。 2. 接下来,了解Redis的基本概念和用法。Redis是一个开源的内存数据库,常用于缓存、消息队列和持久化等场景。你可以学习Redis的数据类型、常用命令以及如何在Java中使用Redis。 3. 在Spring Boot中使用Redis,你可以利用Spring提供的集成方式来实现。Spring Boot提供了对Redis的自动配置,只需添加相关依赖和配置即可使用Redis。 4. 在你的Spring Boot项目中添加Redis依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 5. 在配置文件中配置Redis连接信息。在application.properties或application.yml中添加以下配置: ```properties spring.redis.host=your_redis_host spring.redis.port=your_redis_port ``` 6. 创建一个Redis的操作类或服务类,用于封装对Redis的操作。你可以使用Spring提供的RedisTemplate或者自定义封装类来实现对Redis的读写操作。 7. 在你的业务代码中使用Redis。根据你的需求,可以使用Redis进行缓存数据、分布式锁、消息发布订阅等操作。 8. 最后,通过实际的项目开发和实践来深入学习和理解Spring Boot和Redis的使用。 希望以上步骤对你学习Spring Boot和Redis有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值