Redis
当然开始之前,你的电脑中需要安装好Redis——————
一、NoSQL和Redis简介
1、NoSQL
1-1、NoSQL-Not Only SQL
NoSQL指的是非关系型数据库
,是对不同于传统的关系型数据库的数据库的数据库管理系统的统称,NoSQL是web2.0时代海量数据催生的产物
1-2、特点
1-2-1、不支持SQL语法
:
NoSQL的世界中没有一种通用的语法,每种NoSQL数据库都有自己的语法,以及擅长的业务场景
1-2-2、读写性能高
:
NoSQL数据库存在于内存当中,都具有非常高的读写性能,尤其在海量数据下,它的表现非常优秀
1-2-3、灵活的数据模型
:
NoSQL的存储方式十分灵活,存储方式可以是JSON文档,键值对(key value)或者其他方式
2、Redis
2-1、Redis诞生
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人SalvatoreSanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并与2009年开发完成,这个数据库就是Redis,同一年SalvatoreSanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者PieterNoordhuis一起继续着Redis的开发,直到今天。
Redis全称:Remote Dictionary Server(远程字典服务器
)的缩写,以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容,使用C语言编写,并以内存作为数据存储介质,所以读写数据的效率极高
2-2、特点
2-2-1
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载运行使用
2-2-2
Redis不仅仅支持简单的key-value类型的数据,同时还把value分为list,set,zset,hash等数据结构存储
2-2-3
因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,提高效率
二、Redis基本使用
1、启动和关闭
1-1、启动
redis-server
1-2、关闭
redis-cli SHUTDOWN
这样可以保存数据,强行停止会丢失数据
1-3、多数据库
Redis默认支持16个数据库,从0开始的递增数字命名
SELECT 1
SELECT 来选择使用哪个数据库
1-4、命令行客户端
方法一:将命令作为redis-cli的参数执行
方法二:进入交互模式
三、基础命令
1、基础命令
1-1、设置键和值
通过SET key values
来设置一个新的键值对
SET bar 1
MSET bar1 a bar2 b # 同时设置多个
1-2、获得符合规则的键名列表
通过KEYS patten
来获取key
所对应的value
KEYS *
这里的pattern支持glob风格的通配符格式
GET bar # 存在返回对应的value值,没有返回nil,表示空的意思
MGET bar1 bar2 # 同时获得多个
1-3、判断一个键是否存在
EXISTS key
如果键存在则返回整数类型1,否则返回0
EXISTS bar
1-4、对键重命名
RENAME key new_key
对键值重新命名
RENAME foo foo1
符号 | 含义 |
---|---|
? | 匹配一个字符 |
* | 匹配任意个(包括0个)字符 |
【】 | 匹配括号间的任一字符,可以使用“-”符号表示一个范围,如a【b-d],可以匹配:ab,ac,ad |
\x | 匹配字符x,用于转义符号,如要匹配“?”就需要使用? |
1-5、设置key过期时间
通过EXPIRE key seconds
来设置过期时间
SET bar abc
EXPIME bar 10000
TTL
可以查看key
还剩余的时间,-1表示永久,-2表示不存在
TTL bar
让键重新变成永久,成功返回1,否则返回0,表示键不存在或者本事就是永久
PERSIST bar
通过SET key value EX seconds
来设置过期时间
SET bar 123 EX 2000 # 也可以在设置key就顺便设置时间
或者SETEX key seconds value来设置过期时间
SETEX bar 2000 123
1-6、获取键值的数据类型
使用TYPE key
获取键值的数据类型,Redis中有五种数据类型,因此返回也会有五种数据类型
SET foo 1
TYPE foo
1-7、删除键
DEL key [key…]可以删除一个或多个键,返回值是删除的键的个数
DEL bar
DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键,比如要删除所有以user开头的键,就可以执行:
用普通用户的话,记得转为root用户再执行此命令,否则可能会失败。
1-8、清空所有数据
Redis数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据
四、数据类型
1、字符串类型-string
字符串是Redis的基本数据类型,使用SET生成的键值对,其value就是字符串类型。字符串类型可以存储任何形式的字符串
SET num1
APPEND num2 # 添加字符
#如果value的值是数字,还可以进行加减
INCR num # 加1
DECR num # 减1
#+整数
INCRBY num 10
#-整数
DECRBY num 5
2、列表-list
2-1、添加元素
#LPUSH 左边添加(栈 先进后出)
LPUSH myli 3 4 5
#RPUSH 右边添加(队列 先进先出)
RPUSH myli1 2 1
2-2、获取列表片段
LRANGE myli 0 5
LRANGE myli 0 -1
-1表示最后一个
2-3、查看指定位置元素
LINDEX myli 3
2-4、获取列表长度
LLEN myli
2-5、弹出元素
LPOP myli # 从左边删除元素
RPOP myli # 从右边删除元素
LREM key count value
LREM myli 2 1 #当count>0时LREM命令会从列表左边开始删除前count个值为value的元素
LREM myli -1 2 #当count<0时LREM命令会从列表右边开始删除前【count】个值为value的元素
LREM myli 0 4 #当count=0是LREM命令会删除所有值为value的元素
说明
:当有列表myli
的时候,里面有一个元素x
,你想继续往进加元素的话,就是LPUSH
和RPUSH
,不同的对应不同的添加顺序,当使用LPUSH
的时候添加三个元素a b c
时,查看后的元素顺序为c b a x
,当继续使用RPUSH
的时候进行添加元素m n
时,查看后的元素顺序为c b a x m n
3、哈希类型-hash
我们现在已经知道Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多232-1个字段。
3-1、设置和获取
HSET key field value #设置
HSET bd name budong
HSET bd age 18
HGET key field #获取
HGET bd name
HMSET key field value [field value...]
HMSET ks name kongshan age 18 #设置多个
HMGET key field [field...]
HGET ks name age #获取多个
HKEYS bd #获取所有keys
HVALS bd #获取所有value
HGETALL key
HGETALL bd #获取所有key和value
HLEN bd #获取field的个数
3-2、判断字段是否存在
HEXISTS key field
HEXISTS bd size #判断bd是否存在size,存在返回1,不存在返回0
HSETNX bd size 180 #不存在是添加,存在什么也不做
3-3、增加数字
HINCRBY key field increment
HINCRBY bd age 2
3-4、删除字段
HDEL key field [field...] #删除一个或者多个字段
HDEL bd size
4、集合-set
4-1、增加、查找和删除元素
SADD key member [member ... ] #增加元素,重复的会自动删除
SADD se1 1 2 3 a b
SADD se2 a b c 1 2
SREM key member [member ...] #删除元素
SREM se1 2 #删除指定元素
SPOP key [count] #随机删除count个元素
SPOP se2 2 #随机删除2个元素
SISMEMBER se1 1 #判断元素是否存在
SMEMBERS key #获取所有元素
SMEMBERS se1
SCARD key #获取集合元素个数
SCARD se1
随机获取count
个数元素,count为正数,返回count个不重复数,为负数可能出现重复数据
SRANDMEMBER key [count]
SRANDMEMBER se2 3
4-2、交集
SINTER key1 key2 ...
SINTER se1 se2 #求se1和se2交集
SINTERSTORE destination key1 key2 ...
SINTERSTORE se3 se1 se2 #将交集保存到se3中
4-3、并集
SUNION key1 key2
SUNION se1 se2
SUNIONSTORE destination key1 key2
SUNIONSTORE se4 se1 se2 #将并集保存到se4
4-4、差集
SDIFF key1 key2
SDIFF se1 se2
SDIFFSTORE destiantion key1 key2
SDIFFSTORE se5 se1 se2 #将差集保存到se5
5、有序集合-zset
5-1、有序集合
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数
,这使得我们不仅可以完成插入,删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作,虽然集合中每个元素都是不同的,但是它们的分数却可以相同
5-2、特点和差别
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事
”或“日志
”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skiplist)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是0(log(N)))。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
(4)有序结合要比列表类型更耗费内存
,有序集合类型算得上是Redis的5种数据类型中最高级
的类型了,在学习时可以与列表类型和集合类型对照理解。
5-3、增加、获取和删除元素
ZADD key score member [score member ...]
ZADD math 90 bd 86 ks 88 yf
ZADD还可以用双精度浮点数,+inf表示正无穷,-inf表示负无穷
ZCARD key
ZCARD math #查看元素个数
ZSCORE key member #获取元素分数,不存在则返回nil
ZSCORE math bd
从小到大打印,加上WITHSCORES同时打印分数
ZRANGE key start stop [WITHSCORES]
ZRANGE math 0 -1
ZREVRANGE key start stop [WITHSCORES] #从大到小打印
ZREVRANGE math 0 -1
ZREM key member #移除元素
ZREM math yf
5-4、获取指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)LIMIT向后偏移offset
个元素,并且只获取前count
个元素
ZRANGEBYSCORE math 70 90
ZRANGEBYSCORE math 70 (90 LIMIT 1 2 # 不取90
5-5、获取指定分数范围的元素个数
ZCOUNT key min max
ZCOUNT math 70 90
5-6、增加某个元素的分数
ZINCRBY key increment member
ZINCRBY math 5 bd #增加5分,分数也可以是负数,当然就表示减分了
5-7、按照排名范围删除元素
ZREMRANGEBYRANK key start stop #就是删除按照顺序添加进去的元素start到stop,比如0到2即删除1、2、3位的元素
ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYRANK test 0 2 #删除排名1到3的元素
ZRANGE test 0 -1
5-8、按照分数范围删除元素
ZREMRANGEBYSCORE key min max
ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYSCORE test (3 5 #删除分数大于3小于5的元素
5-9、计算有序集合的交集
ZINTERSTORE destination numkeys key [key...] [WEIGHTS weight...]] [AGGREGATE SUM|MIN|MAX]
计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中的元素个数,destination键中元素的分数是由AGGREGATE参数决定,默认是SUM
ZADD s2 10 a 20 b
ZINTERSTORE s3 2 s1 s2 #2是指有几个集合交集的意思
同样也有并集ZUNIONSTORE用法类似,就不再赘述
五、总结
1、5种数据类型
1-1、string
SET、APPEND等
1-2、List
LPUSH、LRANGE、LPOP、LREM等
1-3、Hash
HSET、HKEYS、HDEL等
1-4、Set
SADD、SREM、SPOP、SMEMBERS、SINTER、SUNION、SDIFF等
1-5、ZSet
ZADD、ZRANGE、ZRANGEBRSCORE、ZCOUNT等