认识Redis
Redis诞生于2009年全称是Remote Dictonary Server,远程词典服务器,是一个基于内存的键值型的NoSqlshujy
特性:
- 键值(key-value) 型,value支持多种不同数据结构,功能丰富
- 单线程,每个命令具有原子性
- 低延迟,速度快(基础内存,IO多路复用,良好的编码)
- 支持数据持久化
- 支持主从集群,分片集群
- 支持多语言客户端
Redis数据结构介绍
Redis是一个key-value的数据库,key一般是string类型,不过value的类型多种多样
String--------------------------------> hello world
Hash---------------------------------->{name:"java",age:"21"}
List------------------------------------->[A->B->C->D]
Set------------------------------------->[A->B->C]
SortedSet----------------------------->[A:1,B:2,C:3]
GEO------------------------------------>{A:{120,3 30.5}}
BitMap--------------------------------->011001101010110
HyperLog------------------------------>011011011011101110
Redis 通过命令
通用指令是部分数据类型的,都可以使用的指定,常见的有:
常用的通用命令有以下几个
命令 | 描述 |
---|---|
KEYs pattern | 查找所有符合给定模式(pattern)的key |
EXISTs key | 检查给定key是否存在 |
TYPE key | 返回key所储存的值的类型 |
TTL key | 返回给定key的剩余生存时间(TTL, time to live),以秒为单位 |
DEL key | 该命令用于在key存在是删除key |
String类型
String类型,也就是字符串类型,是Redis中最简单的存储类型
其value是字符串,不过根据字符串的格式不同,又可以分为3类
string:普通字符串
int:整数类型,可以自增,自减操作
float:浮点类型,可以做自增,自减操作
不管那种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型额最大空间不能超过512mb。
String的常见命令有:
SET : 添加或修改已经存在的一个String类型的键值对
GET:根据key获取String类型的value
MSET:批量添加多个String类型的键值对
MGET:根据多个key获取多个String类型的value
INCR: 让一个整型的key自增1
INCRBY:让一个整型的key自增并指定步长
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX: 添加一个String类型的的键值对,前提key不存在,否则不生效
SETEX: 添加一个String类型的键值对,并且指定有效期
Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于java中HashMap结构
String结构是将对象序列化为JSON字符串后存储,当需要修改某个字段时很不方便
KEY | VALUE |
---|---|
reggie:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
reggie:dish:1 | {“id”:1, “name”: “鲟鱼火锅”, “price”: 4999} |
- Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
KEY | VALUE | |
field | value | |
reggie:user:1 | name | Jack |
age | 21 | |
reggie:user:2 | name | Rose |
age | 18 |
Hash的常见命令有:
HSET key field value: 添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMEST: 批量添加多个hash类型key的field的值
HMGET: 批量获取多个hash类型key的field的值
HGETALL: 获取一个hash类型key中的所有的field和value
HKEYS: 获取一个hash类型的key中所有的field
HVALS: 获取一个hash类型的key中的所有的value
HINCRBY: 让一个hash类型key的字段值自增并指定步长
HSETNX: 添加一个hash类型的key的field的值,前提是这个field不存在,否则不执行
List类型
Redis中List类型与java中的eLinkedList类似,可以看做是一个双向链表结构。既支持正向检索也可以支持反向检索
特征也与LinkedList类似:
一:有序 二:元素可以重复 三:插入和删除快 四:查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等
List的常见命令有:
LPUSH key element :向列表左侧插入一个或多个元素
LPOP key:移除并返回列表左侧中的第一个元素,没有则返回nil
RPUSH key element:向列表右侧插入一个或多个元素
RPOP key: 移除并返回列表右侧中的第一个元素,没有则返回nil
LRANGE key star end: 返回一段角标范围内的所有元素
BLPOP和BRPOP:与LPOP和RPOP类型,只不过在没有元素时可以指定等待时间
如何利用List结构模拟一个栈?(先进后出)
入口和出口在同一边 lpop lpush
如何利用List结构模拟一个队列?(先进先出)
入口和出口不在同一边 lpop rpush
如果利用list结构模拟一个阻塞队列?(阻塞)
入口和出口不在同一边 是队列
出队-时采用BLPOP和BRPOP
Set类型
Redis的set机构与java中的HashSet类似,可以看做是一个value为null的hashMap。因为也是一个hash表,因为具备与HashSet类型的特性:
一:无序 二:不可重复 三:查找快 四:支持交集,并集,差集等功能