Redis数据库

NoSQL

1、概念

not only sql

其指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理的统称,NoSQL是web2.0时代海量数据的产物

2、特点

不支持SQL语法

  • NoSQL的世界中没有一种通用的语法,每种NoSQL数据库都有自己的语法,以及擅长的业务场景

读写性能高

  • NoSQL数据库存储在于内存当中,都具有非常高的读写性能,尤其在海量数据下,它的表现非常优秀

灵活的数据模型

  • NoSQL的存储方式十分灵活,存储方式可以是JSON文档、键值对或者其他方式

Redis

Redis,以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。使用C语言编写,并以内存作为数据存储介质,所以读写效率极高

1、特点

  1. Redis支持数据持久化存储,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用
  2. Redis不仅仅支持简单的key-vlue类型的数据,同时把value分为list、set、zset、hash等数据结构
  3. 因为Redis交换数据块,所以在服务器中常用来存储一些需要频繁调取的数据,提高效率

2、启动和关闭

查看Redis服务

redis-server

关闭Redis服务

redis-cli SHUTDOWN

这样关闭可以保存数据,强行停止会丢失数据

命令行客户端

  • 将命令作为redis-cli的参数执行

    • redis-cli -h 127.0.0.1 -p 6379
      
    • redis-cli PING
      

      -p 后面输入的是端口号

      ping的作用的是检查数据库是否连接成功

  • 进入交互模式

    • redis-cli 
      

多数据库

Redis默认支持16个数据库,从0开始的递增数字命名

SELECT 1

SELECT来选择要存储的数据库

3、基础命令

设置键和值

通过SET key value 来设置一个新的键值对

SET bar 1
MSET bar1 a bar2 b  # 同时设置多个

获取符合规则的键名和列表

通过GET key来获取key所对应的value

通过KEYS pattern来获取数据中拥有的key

KEYS *
GET bar  # 存在返回对应的value值,没有返回null表示空的意思
MGET bar1 bar2  # 同时获得多个

其中的pattern可以是?、*、[]、\,用法符合正则的使用

判断是否存在

EXISTS key如果键存在则返回整数类型1,否则返回0

EXISTS bar

对键重命名

RENAME key new_key对键值重新命名

RENAME bar bar1

设置key过期时间

通过EXPIRE key seconds来设置过期时间,-1表示删除

SET bar abc
EXPIRE bar 100

TTL可以查看key剩余的时间,-1表示永久,-2表示不存在

TTL bar

PERSIST让键重新变成永久,成功返回1,否则返回0,表示键不存在或者本身就是永久的

PERSIST bar

同过SET key value EX seconds来设置过期时间

SET bar 123 EX 1000  # 也可以在设置key就顺便设置时间

或者SETEX key seconds value来设置时间

SETEX bar 100 nihao

获取键值的数据类型

使用TYPE key获取键值的数据类型,Redis中有五种数据类型,因此返回也会有这五种数据类型

SET fool 1
TYPE fool

删除键

DEL key[key1···]可以删除一个或多个键,返回值是删除键的个数

DEL bar
  • DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现

比如我们要删除以user开头的键,就恶意执行

redis-cli KEYS 'user*' | xargs redis-cli DEL
  • 另外由于DEL命令支持多个键作为参数,所以还可以执行
redis-cli DEL redis-cli KEYS "user*"

这样同样的效果,但是性能更好

清空所有数据

Redis数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis示例中所有数据库中的数据

4、数据类型

字符串

字符串是Redis的基本数据类型,使用SET生成的键值对,其value就是字符串类型。字符串类型可以存储任何形式的字符串

SET num 1
APPEND num2  # 添加字符——字符串的拼接
# 如果value值是数字,还可以进行加减
INCR num  # 加一
DECP num  # 减一
# + 整数
INCRBY num 10
# - 整数
DECRBY num 5

列表

添加元素

LPUSH 左边添加(栈 先进后出)

LPUSH myli 3 4 5  

RPUSH 右边添加(队列 先进后出)

RPUSH myli 2 1

获取列表的长度

LLEN myli

查看指定位置的元素

LINDEX myli 3

获取列表片段

LRANGE myli 0 5
LRANGE myli 0 -1

-1表示最后一个

该切片是左闭右闭

弹出元素

LPOP myli  # 从左边弹出元素
RPOP muli  # 从右边弹出元素

多个删除

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的元素

hash类型

我们现在已经知道Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多232−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 … ] # 获取多个

HMGET ks name age  # 获取多个
HKEYS bd  # 获取所有keys
HVALS bd  # 获取所有value

HGETALL key

HGETALL bd  # 获取所有key和value,获取所有键值对
HLEN bd  # 获取filed 个数

判断字段是否存在

HEXISTS key field

HEXISTS bd size  # 存在返回1 不存在返回0
HSETNX bd size 180 # 不存在是添加,存在什么也不做

增加数字

HINCRBY key field increment
HINCRBY bd age 2  # 年龄增加2岁

删除字段

HDEL key field [field…] # 删除一个/多个字段

HDEL bd size

集合

查找和删除元素

增加元素

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 # 删除指定元素

随机删除count个元素

SPOP key [cout]

SPOP se2 2 # 随机删除2个元素

判断元素是否存在

SISMEMBER se1 1

获取所有元素

SMEMBERS key

SMEMBERS se1

获取集合元素个数

SCARD key

SCARD se1

随机获取count 个数元素 count 为正数,返回count个不重复数,为负数可能出现重复数据

SRANDMEMBER key [count]

SRANDMEMBER se2 3

交集

SINTER key1 key2 ..

SINTER se1 se2  # 求se1 和 se2 交集

SINTERSTORE destination key1 key2 ..

SINTERSTORE se3 se1 se2 # 将交集保存到 se3中

并集

SUNION key1 key2

SUNION se1 se2

SUNIONSTORE destination key1 key2

SUNIONSTORE se4 se1 se2 # 将并集保存到se4

差集

set1有而set2没有的元素

SDIFF key1 key2

SDIFF se1 se2

SDIFFSTORE destination key1 key2

SDIFFSTORE se5 se1 se2 # 将差集保存到se5

有序集合

​ 在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同

特点和差别

  1. 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用

  2. 有序集合类型是使用散列表和跳跃表(Skiplist)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))

  3. 列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)

  4. 有序集合要比列表类型更耗费内存。有序集合类型算得上是Redis的5种数据类型中最高级的类型了,在学习时可以与列表类型和集合类型对照理解

添加、获取和删除元素

ZADD key score member [score member … ]

ZADD math 90 bd 86 ks 88 yf

ZADD 还可以用双精度浮点数,+inf 表示正无穷 -inf 表示负无穷

查看元素个数

ZCARD key

ZCARD math # 查看元素个数

获取元素分数

ZSCORE key member

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

获取指定分数范围的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZRANGEBYSCORE math 70 90
ZRANGEBYSCORE math 70 (90 LIMIT 1 2 # 不取90,同时指定1到2位置查找

按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max) LIMIT 向后偏移offset个元素,并且只获取前count个元素

获取指定分数范围的元素个数

ZCOUNT key min max

ZCOUNT math 70 90

增加某个元素的分数

ZINCRBY key increment member

ZINCRBY math 5 bd # 增加5分 分数也可以是负数,表示减分

按照排名范围删除元素

ZREMRANGEBYRANK key start stop

ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYRANK test 0 2 # 删除排名1到3 的元素
ZRANGE test 0 -1

按照分数范围删除元素

ZREMRANGEBYSCORE key min max

ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYSCORE test (3 5  # 删除分数大于3小于5的元素

计算有序集合的交集

ZINTERSTORE destination numkeys key [key…][WEIGHTS weight[weight…]] [AGGREGATE SUM|MIN

计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中的元素个数。destination键中元素的分数是由AGGREGATE参数决定的,默认是SUM

ZADD s2 10 a 20 b
ZINTERSTORE s3 2 s1 s2  # 2 是指有几个集合交集的意思

同样也有并集 ZUNIONSTORE 用法类似,就不在再赘述