单线程:每个命令具备原子性
低延迟,速度快(基于内存、IO多路复用、良好的编码)
支持数据持久化
支持主从集群、分片集群
支持多语言客户端
2.Redis数据库介绍
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
3.Redis的通用命令
KEYS:查看符合模板的所有key,KEYS *查询所有键,不建议在生产环境设备上使用,因为如果数据足够多,模糊匹配可能需要很长时间来查询,又因为Redis是一个单线程。因此不建议在主设备上使用。
DEL:删除一个指定的key,DEL name,删除name,返回值是删除的数量,命令DEL k1 k2 k3 批量删除。
EXISTS:判断key是否存在
EXPIRE:给key设置有效期,有效期到期时该key会被自动删除
TTL:查看一个key的剩余有效期
4.String类型
String类型是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可分为3类:
string:普通字符串
int:整形类型,可自增、自减操作
float:浮点类型,可做自增、自减操作
不管那种格式,底层都是字节数组形式存储,只不过编码方式不同。字符串类型的最大空间不能超过512M
常见命令
SET:添加一个String类型的键值对或者修改已经存在的一个String类型的键值对
GET:根据key获取String类型的value
MSET:批量添加多个String类型的键值对
MGET:根据多个key获取多个String类型的value
INCR:让一个整型的key自增1
INCRBY:让一个整型的key自增并指定步长
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX:添加一个String 类型的键值对,并且指定有效期
5.key的结构
假如一个用户的id叫做id,一个商品的id也是id,除了更改名字来区别,好像没有别的法子了,因为Redis没有表的概念,那么用户和商品就会冲突,因此Redis的key允许有多个单词形成层级结构,多个单词之间用“:”隔开,格式如下
项目名:业务名:类型:id
6.Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于java的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便。Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD,非常人性化:
Hash类型命令
HSET key field value:添加或者修改hash类型的key的field的值(一次只能设置一个field)
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有field和value
HKEYS:获取一个hash类型的key中的所有field
HVALS:获取一个hash类型的key的所有value
HINCRBY:让hash类型key的字段自增并指定步长
HINCRBY user:3 age 2
HSETNX:添加一个hahs类型的key的field值,前提是这个field不存在,否则不执行
7.List类型
Redis中的List类型于java的LinkedList类似,可以看做是一个双向链表,既可以支持正向索引也可以支持反向索引。
特征也于LinkedList类似:
有序
元素可以重复
插入和删除快
查询速度一般
List的常见命令有:
LPUSH key element ... :向列表左侧插入一个或多个元素(一直向左侧加元素)
LPOP key:移除并返回列表左侧的第一个元素,没有则返回null(先进后出栈的思想)
RPUSH key element ... :向列表右侧插入一个或多个元素
RPOP key:移除并返回右侧第一个元素(如果LPUSH存,RPOP取那就是队列的思想)
LRANGE key star end:返回这一段范围内的所有元素,start和end分别是list的索引,索引从0开始
BLPOP和BRPOP:于LPOP、RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
8.Set类型
Redis的Set结构与Java中的HashiSet类似,可以看做是一个value为null的HashMap。以为也是一个hash表,因此具备HashSet类似的特征:
无序
元素不可重复
查找快
支持交集、并集、差集等功能
Set类型的常见命令
SADD key member ... :向set中添加一个或者多个元素
SREM key member ... :移除set中指定元素
SCARD key:返回set中元素的个数
SISMEMBER key member:判断一个元素是否存在于set中,存在返回1,不存在返回0
SMEMBERS key:获取set中的所有元素
SINTER key1 key2 ... :求key1与key2的交集
SDIFF key1 key2 ... :求key1与key2的差集
SUNION key1 key2 ... :求key1与key2的并集
9.SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java的TreeSet有些类似,但是底层数据结构差别很大。SortedSet中每一个元素都带有一个score属性,可基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。SortedSet具备以下特性
可排序性
元素不重复
查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
ZADD key score member:添加一个或者多个元素到sortedset,如果已经存在则更新score值
ZREM key member: 删除 sortedset中的一个指定元素
ZSCORE key member:获取sortedset中指定元素的socre的值
ZRANK key member:获取sortedset中指定元素的排名ZREVRANK key member是倒序。
ZCARD key:获取sortedset 中元素的个数
ZCOUNT key min max :统计score值在给定范围内的所有元素的个数,闭区间的min~max
ZINCRBY key increment member:让sortedset中的指定元素的score值自增,步长为指定的increment值
ZRANGE key min max:按照score排序后,取指定排名范围内的元素,min和max是索引从0开始
ZRANGEBYSCORE key min max:按照sore排序后,获取指定score范围内的元素,min和max是闭区间
ZDIFF、ZINTED、ZUNION:求差集、交集和并集