Redis数据库

目录

Redis简介

        1.1.什么是Redis

                1.1.1Redis简介

                 1.1.2NoSQL的概念

        1.2Redis的特点

                1.2.1性能

                1.2.2并发

二、Redis数据类型

        2.1String数据类型

                2.2.1String基本操作

                2.2.2自增自减操作

                2.2.3控制时效性

        2.2Hash数据类型

                1.2.1hash基本操作

                1.2.2hash扩展操作

        2.3List数据类型

                2.3.1list基本操作

                2.3.2list扩展操作

        2.4Set数据类型

                2.4.1set基本操作

                2.4.2set扩展操作

                2.4.3交集差集并集

Sorted_set数据类型


Redis简介

        1.1.什么是Redis

            1.1.1Redis简介

            

                Redis(Remote Dictionnary Server):即远程字典服务,是一个开源的、采用ANSI C语言编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库。Redis将数据写入内存,不需要通过i/o流读取数据,效率较高。

 Redis官网:Redis

        1.1.2NoSQL的概念

NoSQL(Not Only SQL):泛指非关系型的数据库,区别与关系数据库,它们不保证关系数据的ACID特性。

  •                 那什么是非关系型数据库?

要说非关系型数据库我们首先要了解什么是关系型数据库了,像MySQL就是一个典型的关系型数据库。我们知道,MySQL是一款数据库存储系统,我们操作的步骤是先建立数据库在建立表,表是由行和列组成的二维表格模型,在这个表中,列之间是存在关系的

如下图所示,一张user表

 我们可以看到MySQL的一张表中,除了存储我们的数据之外,还维护者列与列,行与行之间的数据关系。

除此之外,我们知道表之间是存在关系的,一对一、一对多、多对多等。

 在关系型数据库中,除了存储我们的数据之外,还很大程度上维护了我们数据之间的关系。

非关系数据库则不存储数据之间的关系,Redis正是非关系型数据库中的一款热门产品

           1.2Redis的特点

在项目中使用Redis,主要是从两个角度去考虑,性能和并发,这是当前互联网发展过程中首要考虑的两个重难题。当然除去这两个要点之外,Redis还具备可以做分布式锁、任务队列等其他额外功能,此外Redis还易于扩展、支持丰富的数据类型存储

经官方性能测试Redis的读速度是110000次/s,写速度能够达到81000次/s。非常适用于当前高并发、高性能的实际业务场景

                        1.2.1性能

Redis是基于内存级别的缓存,这样使得请求能够快速从缓存中得到响应。相比传统请求数据库,响应速度大幅度提升。

但需要注意的是,引入了Redis后我们的项目架构将会发生一定的变化,如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这引入Redis之间的项目架构

 引入Redis之后,项目架构的变化:

          1.2.2并发

如下图所示 ,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用Redis做一个缓冲操作,并且redis支持高性能的主从复制的集群策略,这样大大提高满足高并发访问及快速响应。请求优先访问到redis请求数据,从而避免高并发情况下直接访问数据库

引入Redis之前的项目框架

引入Redis之后,项目框架的变化

 此外,Redis支持丰富的数据结构,如:字符串(strings),散列(hashes),列表(list),有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。

并且Redis丰富的支持主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript

二、Redis数据类型

2.1String数据类型

2.2.1String基本操作

  •         String类型数据结构如下:

  •  set:存数据
  •         格式:
  • set key value
  • 示例:
  • windowsServer:0>set name zhangsan
    ''ok''
    windowsserver:0>
  • get:取数据
    • 格式:
  • get key
  • 示例:
  • windowsServer:0>del name
    ''1''
    WindowsServer:0>
  • mset:一次性存储多个key
    • 格式:
  • MSet key value[key value...]
  • 语法:
  • windowsserver:0>mset a zhangsan b lisi c wangwu
    ''ok''
    windowsserver:0>
  •   mget:一次性取多个key
    • 格式:
  • mget key [key....]
  • 语法:
  • WindowsServer:0>mget a b c
    1) "zhangsan"
    2) "lisi"
    3) "wangwu"
    WindowsServer:0>
  •    strlen:获取字符个数
    • 格式:
  • strlen key
  •   语法:
  • WindowsServer:0>strlen a
    "8"
    WindowsServer:0>
  • append:追加字符串(如果没有则新增)                
    • 格式:
  • append key value
  • 语法:
  • WindowsServer:0>append a 88
    "10"
    WindowsServer:0>
  • setnx:存入key,如果这个key存在则返回0(false),代表存入失败,如果不存在则返回1(true),代表存入成功
    • 格式:
  • setnx key value
  • 语法:
  • WindowsServer:0>setnx flag 0
    "1"
    WindowsServer:0>setnx flag 0
    "0"
    WindowsServer:0>

            2.2.2自增自减操作

  • 自增:
    • 语法:
  • incr key
    • 格式 :
  • WindowsServer:0>set num 10
    "OK"
    WindowsServer:0>incr num
    "11"
    WindowsServer:0>
  • 控制步长自增
    • 语法:
  • incrby key increment
    • 格式:
WindowsServer:0>incrby num 10
"21"
WindowsServer:0>
  • float类型自增:
    • 格式:
  • incrbyfloat key increment 
    • 语法:
  • WindowsServer:0>set num2 0.5
    "OK"
    WindowsServer:0>incrbyfloat num2 0.5
    "1"
    WindowsServer:0>incrbyfloat num2 0.5
    "1.5"
    WindowsServer:0>
  • 自减
    • 语法:
  • decr key
  • 示例:
WindowsServer:0>set num 10
"OK"
WindowsServer:0>decr num
"9"
WindowsServer:0>decr num
"8"
WindowsServer:0>
  • 控制步长自减:
    • 语法:
  • decrby key increment
  • 示例:
  • decrby a 10

2.2.3控制时效性

  •         语法:
  • setex key seconds value #秒
    
    psetex key milliseconds value #毫秒
  • 示例:
  • WindowsServer:0>setex name 5 zhangsan
    "OK"
    WindowsServer:0>psetex name 5000 zhangsan
    "OK"
    WindowsServer:0>

2.2Hash数据类型

        hash类型的存储结构如下:

 

hash类型的数据结构,底层采用hash表存储。

1.2.1hash基本操作

  • hset:添加/修改数据
  •         格式:
  • hset key field value
  • 示例:
  • WindowsServer:0>hget user username
    'zs'
    windowsServer:0>
  • hdle:删除数据
    • 格式:
  • hdel key field [field...]
  • 示例:
  • WindowsServer:0>hdel user password
    
    "1"
    
    WindowsServer:0>
  • hmset:一次性添加/修改多个字段
    • 格式:
  • hmset key field value [field value...]
  • 示例:
  • WindowsServer:0>hmset user username zs password admin age 20
    "OK"
    WindowsServer:0>
  • hmget:一次性取多个数据
    • 格式:
  • hmget key field [field...]
  • 示例:
  • WindowsServer:0>hmget user username password age
    1) "zs"
    2) "admin"
    3) "20"
    WindowsServer:0>
  • 获取指定key的field的数量
    • 格式:
  • hlen key
  • 示例:
  • WindowsServer:0>hlen user
    "3"
    WindowsServer:0>
  • hexists:判断指定的key中是否包含有指定的field(返回1有或0没有)
    • 格式:
  • hexists key field
  • 示例:
  • WindowsServer:0>hexists user username
    "1"
    WindowsServer:0>hexists user xxx
    "0"
    WindowsServer:0>
  • 1.2.2hash扩展操作

  • hkeys:获取key中所有的field
    • 格式:
  • hkeys key
  • 示例:
  • WindowsServer:0>hkeys user
    1) "username"
    2) "password"
    3) "age"
    WindowsServer:0>
  • hvals:获取key中所有的value
    • 格式:
  • hvals key
  • 示例:
  • WindowsServer:0>hvals user
    1) "zs"
    2) "admin"
    3) "20"
    WindowsServer:0>
  • hgetall:获取指定key中所有的field以及value值
    • 格式:
  • hgetall key
  • 示例:
  • WindowsServer:0>hgetall user
    1) "username"
    2) "zs"
    3) "password"
    4) "admin"
    5) "age"
    6) "20"
    WindowsServer:0>
  • hsetnx:如果指定key中有对应的field则返回0(false),如果没有则存对应的值进去
    • 格式:
  • hsetnx key field value
  • 示例:
  • WindowsServer:0>hsetnx user flag 1
    "1"
    WindowsServer:0>hsetnx user flag 1
    "0"
    WindowsServer:0>
  • 2.3List数据类型

  • 在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均2被移除,那么该键也将会被从数据库中删除。Redis中的list类型采用的是双向链表。
  • Redis存储结构如下:

  • 2.3.1list基本操作

  • 添加/修改数据;
    • 格式
  • lpush key value [value....]  #添加到队列左侧
    rpush key value [value....]  #添加到队列右侧
  • 示例
  • WindowsServer:0>lpush fruits apple pear
    "2"
    WindowsServer:0>rpush fruits banana tomato
    "4"
    WindowsServer:0>
  • fruits链表的变化如下:

  • 获取数据:
    • 格式:
  • lrange key start stop  #从左边开始读取数据,从start索引查询到stop索引
  • 示例:
  • WindowsServer:0>lrange fruits 0 3	# 从0开始查询到3索引
    1) "pear"
    2) "apple"
    3) "banana"
    4) "tomato"
    WindowsServer:0>lrange fruits 0 -2	# 从0开始查询到-2索引
    1) "pear"
    2) "apple"
    3) "banana"
    WindowsServer:0>lrange fruits 0 -1	# 从0开始查询到-1索引(倒数第二),通常用此命令来查询全部数据
    1) "pear"
    2) "apple"
    3) "banana"
    4) "tomato"
    WindowsServer:0>
  • 根据指定的索引查询(从0开始)
    • 格式:
  • lindex key index
  • 示例:
  • WindowsServer:0>lindex fruits 3
    "tomato"
    WindowsServer:0>

        Tips:lindex不支持反向查询

  • 获取并移除数据
    • 格式:
  • lpop key #从队列左边移除一个元素并返回
    rpop key #从队列右边移除一个元素并返回
  • 示例:
  • WindowsServer:0>lpop fruits
    "pear"
    WindowsServer:0>rpop fruits
    "tomato"
    WindowsServer:0>
  • 2.3.2list扩展操作

  • 规定时间内获取并移除数据
    • 格式:
  • blpop key [key...] timeout # 在timeout时间内取出key中的值
    brpop key [key...] timeout
  • 示例:
  • WindowsServer:0>blpop fruits 3
    1) "fruits"
    2) "apple"
    WindowsServer:0>blpop fruits 3
    1) "fruits"
    2) "banana"
    WindowsServer:0>blpop fruits 3		# 3秒内取出fruits中的值并删除,如果没取到则一直处于等待状态
    
    WindowsServer:0>
  • 规定时间内移除lish右边的一个元素到另一个list的左边,并将此元素返回
    • 格式:
  • brpoplpush source destination timeout
  • 示例:
  • WindowsServer:0>flushdb			# 清空数据库
    "OK"
    WindowsServer:0>lpush fruits apple
    "1"
    WindowsServer:0>lpush fruits pear
    "2"
    WindowsServer:0>brpoplpush fruits temp 3
    "apple"
    WindowsServer:0>lrange temp 0 -1
    1) "apple"
    WindowsServer:0>brpoplpush fruits temp 3
    "pear"
    WindowsServer:0>lrange temp 0 -1
    1) "pear"
    2) "apple"
    WindowsServer:0>lrange fruits 0 -1 # fruits链表中已经没有了数据
    
    WindowsServer:0>
  • 移除指定数据
    • 格式:
  • lrem key count value #从list左边开始移除元素
   -count:移除多少个
   - value:移除什么元素
  • 示例:
  • WindowsServer:0>rpush data a b c d e a b c k o
    "10"
    WindowsServer:0>lrange data 0 -1
    1)  "a"
    2)  "b"
    3)  "c"
    4)  "d"
    5)  "e"
    6)  "a"
    7)  "b"
    8)  "c"
    9)  "k"
    10) "o"
    WindowsServer:0>lrem data 2 a 
    "2"
    WindowsServer:0>lrange data 0 -1
    1) "b"
    2) "c"
    3) "d"
    4) "e"
    5) "b"
    6) "c"
    7) "k"
    8) "o"
    WindowsServer:0>
  • 2.4Set数据类型

  • 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数是4294967295。
  • 和List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如sinter、sdiff、sunion等操作。由于这些操作均在服务端完成, 因此效率极高,而且也节省了大量的网络IO开销
  • 2.4.1set基本操作

  • 添加数据:
    • 格式:
  • sadd key member [member...]
  • 示例:
  • WindowsServer:0>sadd cities changsha wuhan nanchang hefei hangzhou fuzhou
    "6"
    WindowsServer:0>
  • 读取全部数据
    • 格式:
  • smembers key
  • 示例:
  • WindowsServer:0>smembers cities
    1) "nanchang"
    2) "wuhan"
    3) "changsha"
    4) "hefei"
    5) "hangzhou"
    6) "fuzhou"
    WindowsServer:0>
  • set 存取无序
  • 删除数据
    • 格式:
  • srem key member [member...]
  • 示例:
  • WindowsServer:0>srem cities fuzhou hangzhou
    "2"
    WindowsServer:0>smembers cities
    1) "changsha"
    2) "nanchang"
    3) "hefei"
    4) "wuhan"
    WindowsServer:0>
  • 获取集合中元素的个数
    • 格式:
  • scard key
  • 示例:
  • WindowsServer:0>scard cities
    "4"
    WindowsServer:0>
  • 判断集合中是否包含指定的数据
    • 格式
  • sismember key member
  • 示例:
  • WindowsServer:0>sismember cities nanchang
    "1"
    WindowsServer:0>
  • 2.4.2set扩展操作

  • 移动集合中的指定元素到另一个集合
    • 格式:
  • smove source destination member
  • 示例:
  • WindowsServer:0>sadd fruits1 apple pear
    "2"
    WindowsServer:0>sadd fruits2 banana tomato
    "2"
    WindowsServer:0>smove fruits1 fruits2 apple
    (integer) 1
    WindowsServer:0>smembers fruits1
    1) "pear"
    WindowsServer:0>smembers fruits2
    1) "apple"
    2) "banana"
    3) "tomato"
  • 在指定的key中随机获取几个值
    • 格式:
  • srandmember key [count]
  • 示例:
  • WindowsServer:0>srandmember cities 2
    1) "hefei"
    2) "changsha"
    WindowsServer:0>
  • 在指定的key中随机获取几个值,并将这几个值移除
    • 格式:
  • spop key [count]
  • count默认为1
  • 示例:
  • WindowsServer:0>spop cities
    "hefei"
    WindowsServer:0>smembers cities
    1) "changsha"
    2) "nanchang"
    3) "wuhan"
    WindowsServer:0>spop cities 2 
    1) "changsha"
    2) "wuhan"
    WindowsServer:0>smembers cities 
    1) "nanchang"
    WindowsServer:0>
  • 2.4.3交集差集并集

  • 取两个集合的交集
    • 格式:
  • sinter key [key...]  #交集
  • 示例:
  • WindowsServer:0>sadd cities1 lanzhou guangzhou fuzhou hangzhou zhengzhou
    "5"
    WindowsServer:0>sadd cities2 meizhou guangzhou quanzhou fuzhou ganzhou
    "5"
    WindowsServer:0>sinter cities1 cities2
    1) "guangzhou"
    2) "fuzhou"
    WindowsServer:0>
  • 取两个集合的差集
    • 格式:
  • sdiff key [key...]  #差集
  • 示例:
  • WindowsServer:0>sdiff cities1 cities2
    1) "zhenghzhou"
    2) "hangzhou"
    3) "lanzhou"
    WindowsServer:0>
  • 取两个集合的并集:
    • 格式:
  • sunion key [key...]  #并集
  • 示例:
  • WindowsServer:0>sunion cities1 cities2
    1) "quanzhou"
    2) "meizhou"
    3) "zhenghzhou"
    4) "lanzhou"
    5) "guangzhou"
    6) "hangzhou"
    7) "fuzhou"
    8) "ganzhou"
    WindowsServer:0>
  • 获取两个集合的交、差、并集存储到指定集合中
    • 格式:
  • sinterstore destination key1 [key2]  #交集
    sdiffstore destination key1 [key2]  #差集
    sunionstore destination key [key2] # 并集
  • sinterstore-案例
  • WindowsServer:0>sinterstore sinter_temp cities1 cities2
    "2"
    WindowsServer:0>smembers sinter_temp
    1) "guangzhou"
    2) "fuzhou"
    WindowsServer:0>
  • sdiffstore-案例
  • WindowsServer:0>sdiffstore sdiff_temp cities1 cities2
    "3"
    WindowsServer:0>smembers sdiff_temp
    1) "zhenghzhou"
    2) "hangzhou"
    3) "lanzhou"
    WindowsServer:0>
  • sunionstore-案例
  • WindowsServer:0>sunionstore sunion_temp cities1 cities2
    "8"
    WindowsServer:0>smembers sunion_temp
    1) "quanzhou"
    2) "meizhou"
    3) "zhenghzhou"
    4) "lanzhou"
    5) "guangzhou"
    6) "hangzhou"
    7) "fuzhou"
    8) "ganzhou"
    WindowsServer:0>
  • Sorted_set数据类型

  • sorted_set基本操作

  •         添加数据:zadd
  • zadd key score1 member1 [score2 member2]
  •         读取数据:zrange/zrevrange
  • ​​​​​​​zrange key start stop [WITHSCORES]
    zrevrange key start stop [WITHSCORES]
  •         根据分值筛选:zrangebyscore/zrevrangebyscore
  • zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
    zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
  • sorted_set其他操作
  •         根据分值范围查询集合总数量:zcount
  •         取多个集合中的交集、并集:zinterstore/zunionstor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值