本系列内容根据自己的学习和理解的基础上,将介绍Redis相关的知识和一些基础操作。如果有写的不对的地方,请各位多多提点。
一篇学会Redis(上)
NoSQL
NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
- NoSQL的特点
- 方便扩展。数据间没有关联,是非关系型的数据库。
- 大数据量,高性能。NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。
- 灵活的数据类型多样性。NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
- 高可用。NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。
- 和关系型数据库一样,也需要安装。
Redis
Redis(Remote Dictionary Server),远程字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- Redis默认存在16个数据库,默认使用第0个数据库(序号从0开始),可用select操作切换。
- 默认端口号是6379。
- Redis是单线程的。
Redis是将数据存储在内存中的,使用单线程去操作是效率最高的。因为在多线程中线程的调度需要需要在用户态(User Mode)和内核态(Kernel Mode)中来回切换,CPU上下文的切换的代价比较高,对于内存上的操作,没有CPU上下文的切换的操作的效率是最高的,多次读写都是在一个CPU上的话,单线程就是最佳的方案。
线程具体实现原理可查看之前写过的内容中对线程部分内容:从头开始学习JVM(七)—— Java内存模型与线程.
Redis的优点
- 速度快,因为数据存在内存中,时间复杂度都较低。
- 支持丰富数据类型,支持string,list,set,sorted set,hash。
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
什么情况下选择Redis
项目中使用Redis的目的,主要是从两个角度去考虑:性能、并发。由于内存的读写速度远快于硬盘,因此Redis的的的在性能上对比其他基于硬盘存储的数据库有非常明显的优势。
- 性能:
在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存,这样,后面的请求就去缓存中读取,请求使得能够迅速响应。
- 并发:
在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用的的Redis的做一个缓冲操作,让请求先访问到的Redis的的,而不是直接访问数据库。
Memcache 与 Redis 的区别
(1)存储方式
- Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。支持数据的备份,即master-slave模式的数据备份。
(2)数据支持类型
- Memcache对数据类型支持相对简单。 Redis有较复杂的数据类型。
(3)使用底层模型不同
- 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
- Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(4)value大小
- redis最大可以达到1GB,而memcache只有1MB。
- Redis 比 Memcached 的优势
- memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型。
- redis的速度比memcached快很多。
- redis可以持久化其数据。
Redis的数据类型与常用操作
Redis是Key-Value数据库,其中value可存储的数据类型有字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
接下来对这些数据类型的操作进行说明。
Redis key类型
类型 | 常用操作 | 解释 |
---|---|---|
key | SET key value | 给key设置value值 |
GET key | 获取key 所储存的value | |