Redis
redis简介
Redis 是一个使用 C 语言写成的,开源的、key-value 结构的、非关系型数据库。它支持存储的 value 类型相对更多,包括 String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合) 和 Hash(哈希),而且这些操作都是原子性的
在此基础上,Redis 支持各种不同方式的排序,为了保证效率,数据都是缓存在内存中,Redis 可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库,缓存和消息中间件,支持网络、可基于内存亦可持久化的日志型、Key-Value型数据库,并提供多种语言的API,为了实现其卓越的性能,Redis采用运行在内存中的数据集工作方式,根据使用情况,管理员可以每隔一定时间将数据集导出到磁盘,或者追加到命令日志中,也可以关闭持久化功能,将Redis作为一个高效的网络的缓存数据功能使用
redis支持的数据类型
redis支持多种类型的数据结构
- 字符串(strings:简单的key-value键值对,value仅仅是String,也可以是int类型)
- 散列(hashes:可看作StringKey与StringValue的map容器)
- 列表(lists:栈,队列)
- 集合(sets:集合)
- 有序集合(sorted sets:有序集合)
redis的三个特点
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
Redis支持数据的备份,即master-slave模式的数据备份
由于springboot的宗旨就是少写配置文件,mybatis需要对缓存进行配置,因此在springboot工程中我们不使用mybatis的缓存功能,可以选择使用redis缓存
redis是运维方面的技术栈,在大数据时代,redis可以解决高并发的问题,因此在后端也被广泛运用
Redis安装与启动
redis在企业中大部分是部署在linux操作系统上的,很少会部署在windows上,但是在操作上基本是一样的
Redis没有官方的windows版本,但是微软开源技术团队开发和维护着这个Win64的版本,可在https://github.com/MicrosoftArchive/redis/releases下载redis解压即用
可以查看一下安装说明:README.md 和 INSTALL
redis的默认端口:6379
redis-cli.exe 客户端
redis-server.exe 服务端
在开启客户端前需要开启服务端
redis-server.exe
#使用默认配置启动redis服务
redis-server.exe redis.conf
#或者指定服务器IP连接redis服务
出现闪退需要相关指令开启,需要先在配置文件中放开bind 127.0.0.1的注释,绑定本机ip地址,在当前路径下开启cmd,输入redis-server.exe redis.windows.conf
尝试一下步骤:
- redis-cli.exe
- shutdown
- exit
- redis-server.exe redis.windows.conf
启动客户端连接:
redis-cli
#使用默认配置连接服务器
redis-cli -h 127.0.0.1 -p 6379
#或者指定服务器IP连接redis服务
查看客户端是否连接成功
> ping
PONG
注:出现PONG,则连接成功!
redis服务关闭
关闭服务:
客户端命令窗口关闭:redis-cli -h 127.0.0.1 -p 6379 shutdown
注:若配置安全认证需添加密码 如
redis-cli -h 127.0.0.1 -p 6379 -a pwd shutdown
数据库操作:
查看所有存在的键值
keys *
清空所有数据库数据
flushall
清空当前数据库数据
flushdb
五种基本数据类操作
String操作
String举例:
添加、修改一个string:
127.0.0.1:6379> set test 123
OK
重新赋值:
127.0.0.1:6379> set test 456
OK
查询一个string:
127.0.0.1:6379> get test
"456"
append 追加一个string,返回字符串长度
127.0.0.1:6379> append test 456
(integer) 6
删除一个key:
127.0.0.1:6379> del test
(integer) 1
返回字符串长度
127.0.0.1:6379> strlen test
(integer) 0
HashMap操作
hash是一个string类型的field和value的映射表,可以看作是一个Map表结构容器
添加(创建)一个hash:
127.0.0.1:6379> hmset hashtest name xiaoming age 12
OK
返回整个hash:
127.0.0.1:6379> hgetall hashtest
1) "name"
2) "Tom"
3) "age"
4) "12"
返回hash中的一个字段:
127.0.0.1:6379> hget hashtest name
"Tom"
返回hash中的多个字段:
127.0.0.1:6379> hdel hashtest age
删除一个hash中的字段:
127.0.0.1:6379> hdel hashtest name age
(integer) 2
添加、修改hash中的字段,如果修改成功返回0
127.0.0.1:6379> hset hashtest name xiaoming
(integer) 0
查看指定键是否存在:
127.0.0.1:6379> hexists age
(integer) 0
注:返回整数1或0
1表示哈希包含该字段
0表示哈希不包含该字段,或key不存在
List操作
redis中数组底层封装的是栈、队列
添加元素到**列表头(leftpush)**:
127.0.0.1:6379> lpush ls a b c
(integer) 3
获取列表指定范围内的元素(起始索引到结束索引位置),-1会取到所有数据
127.0.0.1:6379> lrange ls 0 2
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lrange ls 0 -1
1) "5"
2) "0"
3) "3"
4) "2"
5) "1"
6) "c"
7) "b"
8) "a"
添加元素到**列表尾(rightpush)**:
127.0.0.1:6379> rpush ls 1 2 3
(integer) 6
查看key对应的value类型:
127.0.0.1:6379> type ls
list
通过索引获取列表中的值
127.0.0.1:6379> lindex ls 3
"2"
获取列表长度:
127.0.0.1:6379> llen ls
(integer) 8
移除元素:
127.0.0.1:6379> lrem ls count value
count > 0:从表头开始向表尾搜索,移除与value相等的元素,移除count个
count < 0:从表尾开始向表头搜索,移除与value相等的元素,移除|count|个
count = 0:移除表中所有与value相等的值
Set操作
Set是String类型的无序集合,集合成员是唯一的,不允许重复
添加数据到集合:
127.0.0.1:6379> sadd settest 1 2 3
(integer) 3
返回集合数据:
127.0.0.1:6379> smembers settest
1) "1"
2) "2"
3) "3"
获取集合数量:
127.0.0.1:6379> scard settest
(integer) 3
移除集合中的值:
127.0.0.1:6379> srem settest 3
(integer)1
SortedSet操作
Redis有序集合和集合一样也是String类型元素的集合,且不允许重复的成员
有序集合特点:
1、有序集合中每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
2、有序集合的成员是唯一的,但分数(score)却可以重复
3、有序集合和集合一样也是String类型元素的集合,且不允许重复的成员
添加元素到集合:
注:如果value(a)存在,更新分数,否则添加新value,分数可以相同
127.0.0.1:6379> zadd sortset 1 a
(integer) 1
返回指定元素的分数:
127.0.0.1:6379> zscore sortset a
"1"
查询元素(起始索引到结束索引位置):
127.0.0.1:6379>zrange sortset 0 1
1)"a"
移除集合中的元素:
127.0.0.1:6379> zrem sortset a
(integer) 1
根据分数区间查询元素个数
127.0.0.1:6379> zcount zset 1 10
有序集合与列表(EXT)
有序集合类型在某些方面和列表类型有些相似:
1、二者都是有序的
2、二者都可以获得某一范围的元素
但是二者有着很大的区别,这使得它们的应用场景也是不同的:
列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用
有序集合类型是使用散列表和跳跃表(Skiplist)实现的,所以即使读取位于中间部分的数据速度也很快
列表中不能简单地调整某个元素的位置,但是有序集合可以
有序集合要比列表类型更耗费内存,有序集合类型算得上是Redis的5种数据类型中最高级的类型
springboot整合redis
导入maven坐标
<!--redis场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
redis可以完成对数据的缓存:
先从数据库中把对应的数据查出来,然后将数据存到redis缓存中,下次再查询对应数据的时候就从缓存中取数据,避免多次与数据库进行交互(高并发解决方案之一)
将springboot整合redis的模板对象聚合到controller中
以后用springboot集成第三方技术的时候,都会有模板对象,比如以后在企业中接触到的中间件rabbitmq,activemq,也需要从容器中获取模板对象
//直接从容器中取到redis的模板对象
@Autowired
private RedisTemplate redisTemplate;
配置连接信息
#连接redis相关的配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
#有密码就写,没有就不用写
spring.redis.password=
存放进redis缓存的具体操作
List<Emp> empList = null;
//判断redis中是否存在数据
if (redisTemplate.boundListOps("empList").size() > 0){
//range() 取出redis中对应集合的数据
empList = redisTemplate.boundListOps("empList").range(0,-1);
}else {
//去mysql数据库中查询数据
empList = empService.getEmpList();
//将mysql中取出来的数据封装到redis缓存中
for (Emp emp : empList) {
//将对象封装到redis队列中
redisTemplate.boundListOps("empList").rightPush(emp);
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com