1.Redis简介

  • Redis是完全开源免费的,遵守RSD协议,是一个高性能的key-value数据库

2.Redis优势

  • 性能极高-
    • Redis能读的速度是11W次/秒,写的速度是8.1W次/秒
  • 丰富的数据类型
    • Redis支持二进制的字符串、列表、嘻哈值、集合和有序集合等数据类型操作。
  • 原子性
    • Redis的所有操作都是原子性的,也就是要么成功执行,要么失败完全不执行
  • 单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
  • 丰富的特性
    • Redis还支持 发布/订阅、通知、key过期等等特性

3. 数据类型

  • 字符串 string
  • 哈希值
  • 列表
  • 集合
  • 有序集合

判断key的类型:

	type key

3.1 字符串

  • 字符串是最基本的类型,一个key对应一个value
  • 字符串类型是二进制安全的。意思是redis的字符串可以包含任何数据。比如jpg图片或者序列化的对象。
  • 字符串类型是Redis最基本的数据类型,一个键最大能存储512M

3.1.1 SET设置值

  • 以下就设置了键name,和值yuhua。注意,键最大可以存储512M
	SET name yuhua

3.1.2 GET获取值

	GET name

3.1.3 获取子串

  • 语法:GETRANGE key 起始位置,结束位置
	GETRANGE name 1 2
	//返回的结果就是
	"uh"

3.1.4 递增、递减

  • 语法:INCR/DECR 变量
  • 假设设置age为1,然后递增成2
	SET age 1
	//递增1
	INCR age
	//返回
	(integer) 2
	//递减1
	DECR age
	//返回
	(integer) 1

3.1.5 删除key(也就删除了value)

  • 语法:DEL key
	//删除age这个key,如果再获取就获取不到了
	DEL age

3.1.6 判断key是否存在

  • 语法:EXISTS key
  • 返回值:0表示不存在,1表示存在
	EXISTS age
	//返回0 表示不存在
	EXISTS name
	//返回1 表示存在

3.1.7 给key设置过期时间

  • 语法:EXPIRE 过期时间(S为单位)
  • 返回值:1表示尚未过期,0表示过期了
	EXPIRE name 10

3.1.8 返回key有效时间还剩多少

  • 语法:TTL key
  • 返回值:key剩余的有效时间,过期的话,返回过期了多少秒,也是数值,是负数
	EXPIRE name 10
	TTL name
	//返回name这个key剩余的有效时间
	(integer) 2
	//如果时间到了,则返回0
	(integer) 0
	//如果有效期过了2s,则返回-1
	(integer) -2

3.2 哈希值

  • 哈希值是一个字符串类型的key和值的映射表,特别适合用于存储对象

3.2.1 HSET HMSET设置单个值和多个值

  • 设置单个值:HSET
  • 设置多个值:HMSET
	//设置单个值
	HSET person name yuhua
	//意思就是设置person的name是yuhua,相当于js中的person={name:"yuhua"}


	//设置多个值
	HMSET person name yuhua age 10
	//意思就是设置person的name是yuhua,age是10,相当于js中的person={name:"yuhua",age:"10"}

3.2.2 获取单个值、多个值和所有值

  • 获取单个值:HGET
  • 获取多个值:HMGET
  • 获取所有制:HGETALL
	//获取单个值
	HGET person name //获取person对象中的name属性对应的值


	//获取多个值
	HMGET person name age //获取person对象中的name和age属性对应的值

	//获取所有值
	HGETALL person //获取person对象中所有的key和value
	//返回:
	1)"name"  //key
	2)"yuhua" //value
	3)"age"   //key
	4)"10"    //value

3.2.3 HDEL删除键

  • 语法:HDEL 对象名 属性名
	HDEL person name//删除对象person中的name

3.2.4 获取所有的键值

  • 语法:HKEYS 对象名
	HKEYS person //获取person对象的所有属性
	//返回结果是
	1) "name"
	2) "age"

3.3 列表

  • 列表时简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或尾部(右边)

3.3.1 向左/向右添加元素

  • 向左添加元素语法:LPUSH 列表名(有点像数组) 值(字符串类型)
  • 向右添加元素语法:RPUSH 列表名(有点像数组) 值(字符串类型)
	LPUSH ids 2 //相当于向ids(列表/数组)左边插入一个字符串2
	LPUSH ids 1
	RPUSH ids 3 //相当于向ids(列表/数组)右边插入一个字符串3
	RPUSH ids 4
	RPUSH ids 5 6 //可以插入多个元素

3.3.2 LRANGE 查看元素

  • 语法:LRANGE 列表名称 起始位置,结束位置
  • 特别的:
    • 如果查询所有元素:LRANGE 列表名 0 -1
	LRANGE ids 0 2;//查询index为0到index为2的所有元素
	//返回
	1) "1"
	2) "2"
	3) "3"

	LRANGE ids 0 -1;//查询所有元素,因为index为0,是最左边的一个,-1就相当于倒着数第一个,也就是最右边一个,所以是所有元素

3.3.3 LPOP RPOP 弹出元素,删除元素

  • 最左边删除一个的语法:LPOP 列表名
  • 最右边删除一个的语法:RPOP 列表名
	//假设原先ids是 1 2 3
	LPOP ids //删除最左边的一个元素
	//查看所有元素
	LRANGE ids 0 -1
	//返回结果
	1) "2"
	2) "3"


	RPOP ids //删除最右边的一个元素
	//查看所有元素
	LRANGE ids 0 -1
	//返回结果
	1) "2"

3.3.4 LINDEX 根据索引获取列表中的元素

  • 语法:LINDEX 表名 索引号
	//假设ids列表是 1 2 3 
	LINDEX ids 1
	//返回
	"2"

3.3.5 LLEN 获取列表长度

  • 语法:LLEN 列表名称
	LLEN ids

3.3.6 LREM 移出列表元素

  • 语法:LREM 列表名 count value
    • count>0:从表头开始向表尾搜索,移出与VALUE相等的元素,数量为COUNT
    • count<0:从表尾开始向表头搜索,移出与VALUE相等的元素,数量为COUNT的绝对值
    • count=0:移出表中所有与VALUE相等的值
  • 举例:
	//假设有列表 ids为3 2 2 2 1
	LREN ids 2 2;//代表要删除的对象是ids列表,第一个2是正数,代表向右删除,且删除2个,第二个2代表要删除的值为2
	LRANGE 0 -1
	//结果为
	1) "3"
	2) "2"
	3) "1"

	//注意,如果第一个2是负数,则是向左删除。如果是0,代表移出所有与value相等的元素。

3.4 集合

  • 集合是字符串类型的无序集合
  • 特点:
    • 不重复
    • 有交集、并集等

3.4.1 SADD 添加

  • 如果集合中已经存在指定的元素则返回0,如果不存在则添加成功返回1
	SADD tags 1 //返回1,代表添加成功
	SADD tags 2 //返回1,代表添加成功
	SADD tags 2 //返回0,代表添加失败,因为集合的元素是唯一的
	SADD tags 3 //返回1,代表添加成功
	SADD tags 4 5 6 //返回3,代表添加成功3个

3.4.2 SMEMBERS 查看集合

	SMEMBER tags
	//返回结果是
	1) "1"
	2) "2"
	3) "3"
	4) "4"
	5) "5"
	6) "6"

3.4.3 SCARD 获取集合元素个数

	SCARD tags

3.4.4 SREM 删除元素

  • 语法: SREM 集合名称 成员元素的值
	SREM tags 3

3.4.5 SINTER 交集

  • 语法:SINTER 集合A 集合B
  • 含义:返回集合A和集合B的交集
	SADD A 1 2 3
	SADD B 2 3 4
	SINTER A B
	//返回A和B的交集,为集合:
	1) "2"
	2) "3"

3.4.6 SUNION 并集

  • 语法:SUNION 集合A 集合B
  • 含义:返回集合A和集合B的并集
	SADD A 1 2 3
	SADD B 2 3 4
	SUNION A B
	//返回A和B的并集,为集合:
	1) "1"
	2) "2"
	3) "3"
	4) "4"

3.4.7 SDIFF 差集

  • 语法:SDIFF 集合A 集合B
  • 含义:集合A的元素减去集合B中跟A一样的元素
    ···
    SADD A 1 2 3
    SADD B 2 3 4
    SDIFF A B
    //返回A和B的差集,为集合:
    1. “1”
      ···

3.5 有序集合

  • 有序集合和集合一样,也是字符串的集合,而且不能重复
  • 有序集合和集合的区别是:每个有序集合都会关联一个double类型的分数,redis可以通过这个分数来为有序集合中的元素进行从小到大排序,元素不能重复,但分数可以重复

3.5.1 ZADD添加元素

  • 语法:ZADD 有序集合名称 分数 元素值
  • 注意:分数可以重复,元素值不能重复
	//添加
	ZADD levels 1 one
	ZADD levels 2 two
	ZADD levels 3 three
	ZADD levels 4 four

	//查看有序集合的成员
	ZRANG levels 0 -1
	//返回结果:
	1) "one"
	2) "two"
	3) "three"
	4) "four"

3.5.2 查看有序集合的成员

3.5.2.1 只查看成员,不查看分数
  • 语法:ZRANG 有序集合名 0 -1
	//查看有序集合的成员
	ZRANG levels 0 -1
	//返回结果:
	1) "one"
	2) "two"
	3) "three"
	4) "four"
3.5.2.2 查看成员和分数
  • 语法“ZRANG 有序集合名 0 -1 WITHSCORES
		//查看有序集合的成员
	ZRANG levels 0 -1 WITHSCORES
	//返回结果:
	1) "one"
	2) 1
	3) "two"
	4) 2
	5) "three"
	6) 3
	7) "four"
	8) 4

3.5.3 移除有序集合的成员

  • 语法:ZREM 有序集合名 集合元素值
  • 这样对应的分数也会被删除
	ZREM levels one