什么是Redis
要了解Resis最好就是去官网看下 官网 英文看不懂我们可以google翻译嘛,不过官方介绍Redis的第一句应该是可以很容易看懂:“Redis is an open source (BSD licensed),in-memory data structure store, used as a database,cache and message broker.”
- Redis是一个开源的,基于内存的数据结构存储,可用作于数据库、缓存、消息中间件。
- 从官方的解释上,我们可以知道:Redis是基于内存,支持多种数据结构。
- 从经验的角度上,我们可以知道:Redis常用作于缓存。
为什么要使用Redis
我们知道Redis是基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。
我们可以发现这不就是Java的Map容器所拥有的特性吗,那为什么还需要Redis呢?
- Java实现的Map是本地缓存,如果有多台实例(机器)的话,每个实例都需要各自保存一份缓存,缓存不具有一致性
- Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。
- Java实现的Map不是专业做缓存的,JVM内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着JVM销毁而结束。Map所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。
- Redis是专业做缓存的,可以用几十个G内存来做缓存。Redis一般用作于缓存,可以将缓存数据保存在硬盘中,Redis重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制等等简单好用的功能。
为什么要用缓存呢?说到底还是为了性能
一般如果我们不使用缓存,用户请求的什么数据都需要频繁的去操作数据库,这种操作是非常消耗资源的,而且如果我们的网站出现了性能问题(访问时间慢),按经验来说,一般是由于数据库撑不住了。因为一般数据库的读写都是要经过磁盘的,而磁盘的速度可以说是相当慢的(相对内存来说)看看我们没用缓存之前一个请求的完成过程
如果学过Mybaits、Hibernate的同学就可以知道,它们有一级缓存、二级缓存这样的功能(终究来说还是本地缓存)。目的就是为了:不用每次读取的时候,都要查一次数据库。
有了缓存之后,我们的访问就变成这样了:查询一些缓存中存在的数据我们可以不用经过数据库
Redis的数据结构
首先还是得声明一下,Redis的存储是以key-value的形式的。Redis中的key一定是字符串,value可以是string、list、hash、set、sortset这几种常用的。
key | value |
String | String(字符串) |
String | hash(哈希) |
String | list(列表) |
String | set(集合) |
String | setsorted set(有序集合) |
值得注意的是:Redis并没有直接使用这些数据结构来实现key-value数据库,而是基于这些数据结构创建了一个对象系统.通俗的来说就是:Redis使用对象来表示数据库中的键和值。每次我们在Redis数据库中新创建一个键值对时,至少会创建出两个对象。一个是键对象,一个是值对象(key是一个对象,value也是一个对象)。
下面我们来详细了解redis的数据结构
需要测试的可以直接在线体验redis不用安装 http://try.redis.io/
1. String
有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。
首先我们来看一个String简单的例子
一些String常用的命令及相关解释
命令 | 解释 |
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值。 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
GETBIT key offset | 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
MGET key1 [key2…] | 获取所有(一个或多个)给定 key 的值。 |
SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
SETNX key value | 只有在 key 不存在时设置 key 的值。 |
SETRANGE key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
STRLEN key | 返回 key 所储存的字符串值的长度MSET key value [key value …]同时设置一个或多个 key-value 对。 |
2. hash