凡是学过计算机的,多多少少都听说过Redis,或许有的人也清楚它是一个数据库,但是和关系型数据库不一样,那么它究竟是什么呢?
Redis数据库文件
链接:https://pan.baidu.com/s/1jOHEca7Q8VjapRRdNFiXqg
提取码:q9pq
简介
非关系型数据库,NoSQL(No: Not Only):redis, mongodb, hbase…
存储key,value,可以理解为是一个很大的Map结构
如 name:zhangsan
age:23
- 数据之间没有关联关系
- 数据时存在内存里面的
Redis可以用在查询一些不经常发生变化的数据
NoSQL(NoSQL = Not Only SQL),即不仅仅是SQL,是一项全新的数据库理念,泛指非关系型数据库
随着互联网web 2.0网站的兴起,传统的关系数据库在应对web 2.0 网站,特别是 超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,
暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL数据库的产生就是为了解决大规模数据集合带来的挑战,尤其是大数据应用难题。
web1.0用户只是访问,web2.0指纯动态的网站,以用户人为中心,用户可以发布自己的资源到网络上例如 抖音用户发布视频到抖音上,如果使用关系型数据库访问就比较慢。
缓存思想
首先Redis中取出数据
- Redis中有:直接返回
- Redis中没有:
- 从数据库中查询
- 将数据放到Redis缓存中
- 返回数据
内存中缓存的选择有很多,可以使用Map集合,但是Map集合只能当前项目使用,但是要做分布式的部署有多台电脑的话Map集合就不适合了,毕竟两个Map之间传递数据不是特别方便,容易提高成本,使用非关系型数据库数据存储在内存中的而且可以部署独立机器
NOSQL和关系型数据库比较
优点:
- 成本:nosql数据库简单部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜
- 查询速度:nosql数据库将数据存放在缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql
- 存储数据格式:nosql的存储格式key,value形式,key是字符串,value支持很多格式,文档形式,图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型
- 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难.
缺点:
- 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语
- 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本(就是大家都是非关系型数据库,但是没有统一标准,在Redis中能够执行的命令在其他非关系型数据库中可能就不生效)
- 不提供关系型数据库对事物的处理
什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
- 字符串类型 string
- 哈希类型 hash(java map)
- 列表类型 list
- 集合类型 set(无序不重复)
- 有序集合类型 sortedset(有序不重复)
Redis的数据结构
Redis存储的是:key,value格式的数据,其中key一定是字符串类型,而value有5中不同的数据结构
value的数据结构:
- 字符串类型 string
- 哈希类型 hash(map 格式)
- 列表类型 list : (LinkedList格式,支持重复元素)
- 集合类型 set:(不允许重复元素,且无顺序)
- 有序集合类型 sortedset (有序且不允许重复元素)
详解命令
- 字符串类型
- 哈希类型 hash : map
- 列表类型 list
可以添加元素到列表的头部(左边)或者尾部(右边),可以模拟一个队列的操作
获取:
lrange key start end
返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
- 集合类型 set
- 有序集合类型 sortedset
通用命令
keys *:查询所有的键
type key: 获取键对应的value的类型
del key:删除指定的key value
SpringBoot整个Redis:
添加依赖:
<!-- redis依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.properties中配置redis:
# 配置Redis
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
RedisUtil工具类:
@Component
public class RedisUtil {
// @Autowired
// private RedisTemplate<String, Object> redisTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
// Key(键),简单的key-value操作
/**
* 实现命令:DEL key,删除一个key
*
* @param key
*/
public void del(String key) {
redisTemplate.delete(key);
}
// String(字符串)
/**
* 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
*
* @param key
* @param value
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
*
* @param key
* @param value
* @param timeout
* (以秒为单位)
*/
public void set(String key, String value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
/**
* 实现命令:GET key,返回 key所关联的字符串值。
*
* @param key
* @return value
*/
public String get(String key) {
return (String)redisTemplate.opsForValue().get(key);
}
}
@SpringBootTest
public class RedisTest {
@Autowired
private RedisUtil redisUtil;
@Test
public void testSet() {
redisUtil.set("address", "青岛");
}
@Test
public void testGet() {
String address = redisUtil.get("address");
System.out.println(address);
}
}