一.Redis
1.NoSql
Redis是目前非常流行的一款NoSql数据库.
什么是NoSql
NoSql简介
NoSQL(NoSQL=Not Only SQL),意即”不仅仅是SQL”.
在现代的计算系统上每天网络上都会产生庞大的数量.
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理.1970年E.F.Codd’s提出关系模型的论文”A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单.
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术.
NoSQL是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨.NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入.
常见的NoSql产品
二.Redis介绍
2.1Redis简介
特性:
多种数据类型存储:
- 字符串类型 string
- 散列类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 zset(sorted set)
内存存储与持久化:
- 内存的读写速度远快于硬盘
- 自身提供了持久化功能(RDB,AOF两种方式)
功能丰富:
- 可用作缓存,队列,消息订阅/发布
- 支持键的生存时间
- 按照一定规则删除相应的键
简单稳定:
- 相比SQL而言更加简单
- 不同语言的客户端丰富
- 基于C语言开发,代码量只有3万多行
2.2. Redis与Memcache
Redis和Memcache是目前非常流行的两种NoSql数据库,都可以用于服务端缓存.两者有怎样的差异呢?
从实现来看:
- Redis:单线程
- Memcache:多线程
从存储方式来看:
- Redis:支持数据持久化和主从备份,数据更安全
- Memcache:数据存与内存,没有持久化功能
从功能看:
- Redis:除了基本的k-v机构外,支持多种其他复杂结构,事务等高级功能
- Memcache:只支持基本k-v结构
从可用性看:
- Redis:支持主从备份,数据分片,哨兵监控
- Memcache:没有分片功能,需要从客户端支持
可以看出,Redis和Memcache功能更强大,支持的数据结构也比较丰富,已经不仅仅是一个缓存服务.而Memcache的功能相对单一.
2.3 Redis指令
Redis指令在线测试网址:https://try.redis.io/
通过help命令可以让我们查看Redis指令帮助信息:
在help后面跟上空格,然后按tab键,回看到Redis对命令分组的组名:
主要包括:
- @generic:通用指令
- @String:字符串类型指令
- @list队列结构指令
- @set:set结构指令
- @sorted_set:可排序的set结构指令
- @hash:hash结构指令
其中除了@generic以外的,对应了Redis常用的5中数据类型:
- String:等同于java中的Map<String,String>
- List:等同于java中的Map<String,List>
- Set:等同于java中的Map<String,Set>
- sort_set:可排序的set
- Hash:等同于java中的Map<String,Map<String,String>>
可见,Redis中存储数据结构都是类似java的map类型.Redis不同数据类型,只是’map’的值的类型不同.
2.3.1 通用指令
keys:获取符合规则的键名列表.
语法:keys pattern
示例:keys *(查询所有的键)
这里的pattern其实是正则表达式,所以语法基本是类似的
exists:判断一个键是否存在,如果存在返回整数1,否则返回0
语法:exists key
示例:
del:删除key,可以删除一个或多个key,返回值是删除的key的个数
语法:del key[key…]
示例:
expire:设置key的过期时间,超过时间后,将会自动删除该key.
语法:expire key seconds
返回值:
如果成功设置过期时间,返回1
如果key不存在或者不能设置过期时间,返回0
TTL:查看一个key的过期时间
语法:TTL key
返回值:
返回剩余的过期时间
1:永不过期
2:已过期或不存在
示例:
persist:移除给定的生存时间,将这个key从带生存时间key转换成一个不带生存时间,永不过期的key.
语法:persist key
返回值:
当生存时间移除成功时,返回1.
如果key不存在或key没有设置生存时间,返回0.
示例:
rename:重命名
语法:
rename key newkey
type:判断一个key的类型
语法:
type key
ping:测试连接是否正常
2.3.2 字符串指令
字符串结构,其实是Redis中最基础的K-V结构.其键和值都是字符串.类似于Java中的Map<String,String>
字符串烈性是Redis中最基本数据类型,它能存储任何形式的字符串,包括二进制数据.可以存储JSON化的对象,字节数组等.一个字符串类型键允许存储的数据最大容量是512MB.
常用指令:
语法 | 说明 |
---|---|
set key value | 设置指定key的值 |
get key | 获取指定key的值 |
getrange key start end | 返回key中字符串值得子字符(start和end是字符串开始和结束的下标值) |
incr key | 将key中存储的数字值增1 |
incrby key increment | 将key所存储的值加上给定的增量值(increment) |
decr key | 将key中存储的数字值减1 |
decrby key decrement | 将 key所存储的值减去给定的减量值(decrement) |
append key value | 如果key已经存在并且是一个字符串,append命令将value追加到key原来的值得末尾 |
strlen key | 返回key所存储的字符串值得长度 |
mget key1 key2 | 获取所有(一个或多个)给定key的值 |
mset key value key value | 同时设置一个或多个key-value对 |
2.3.3. hash结构命令
Reids的Hash结构类似于Java中Map<String,Map<String,String>>,键是字符串,值是另一个映射.结构如图:
这里我们称键为key,字段名为hKey,字段值为hValue
常用指令:
HSET,HSETNX和HGET(添加,获取)
HSET介绍:
HSET key field value:将哈希表key中的字段field的值设为value.
Hset命令用于为哈希表中的字段赋值.
如果哈希表不存在,一个新的哈希表被创建并进行HSET操作.
如果字段已经存在于哈希表中,旧值将被覆盖.
返回值:
如果字段是哈希表中的一个新建字段,并且值设置成功,返回1.
如果哈希表中域字段已经存在且旧值已经被新值覆盖,返回0.
示例:
HGET介绍:
HGET key field:获取存储在哈希表中指定字段的值
Hget命令用于返回哈希表中指定字段的值
返回值:
返回给定字段的值.如果给定的字段或key不存在时,返回nil.
示例:
HGETALL介绍:
HGETALL key:获取在哈希表中制定key的所有字段和值
返回值:
指定key的所有字段的名及值.返回值里,紧跟每个字段名(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍
示例:
HKEYS介绍:
HKEYS key:获取所有哈希表中的字段
示例:
HVALS介绍:
HVALS key:获取哈希表中所有值
注意:这个命令不是HVALUES,而是HVALS,是value的缩写val
示例:
HDEL介绍:HDEL命令用于删除哈希表key中的一个或多个指定字段,不存在的字段将被忽略.
语法:
HDEL key field1 [field2]
返回值:
被成功删除字段的数量,不包括被忽略的字段
示例:
2.3.4. 多数据库性
Redis默认是16个数据库,编号是从0-15
select index:切换库
move key index:把key移动到几号库(index是库的编号)
flushdb:清空当前数据库
flushall:清空当前实例下所有的数据库