Redis基础

Redis知识总结

Redis介绍

什么是Redis?

  • Redis使用C语言开发的一个 开源的高性能 键值对(key-value)内存数据库,它是单线程的数据库
  • 它提供了 五种数据类型来存储 【值】:字符串类型(String)、散列类型(hash)、列表类型(list)、集合类型(set)、有序集合类型(sortedset、zset)
  • 它是一种NoSQL数据库

什么是NoSQL?

  • NoSQL,即Not-Only SQL(不仅仅是SQL),泛指 非关系型的数据库
  • 什么是 关系型数据库?数据结构是一种有行有列的数据库
  • NoSQL数据库是为了解决 高并发、高可用、高可扩展、大数据存储问题而产生的数据库解决方案
  • NoSQL可以作为关系型数据库的良好补充,但是 不能替代关系型数据库

NoSQL数据库分类

键值(key-value)存储数据库
  • 相关产品:Tokyo Cabinet/Tyrant、redis、Voldemort、Berkeley DB
  • 典型应用:内容缓存,主要用于处理大量数据的高访问负载
  • 数据模型:一系列键值对
  • 优势:查询快
  • 劣势:存储的数据缺少结构化
列存储数据库
  • 相关产品:Cassandra、HBase、Riak
  • 典型应用:分布式的文件系统
  • 数据模型:以列簇式存储,将同一列数据存在一起
  • 优势:查询速度快,可扩展性强,更容易进行分布式扩展
  • 劣势:功能相对局限
文档型数据库
  • 相关产品:CouchDB、MongoDB
  • 典型应用:Web应用(与key-value类似,value是结构化的)
  • 数据模型:一系列键值对
  • 优势:数据结构要求不严格
图形(Graph)数据库
  • 相关产品:Neo4J、InfoGrid、Infinite Graph
  • 典型应用:社交网略、
  • 数据模型:图结构
  • 优势:利用图结构相关算法
  • 劣势:需要对整个图做计算才能得出结果,不同意做分布式的集群方案

Redis应用场景

  • 内存数据库(登录信息、购物车信息、用户浏览记录等)
  • 缓存服务器(商品数据、广告数据等等)(最多使用)
  • 解决分布式集群架构中的session分离问题(session共享)
  • 任务队列(秒杀、抢购等等)
  • 分布式锁的实现
  • 支持发布订阅的消息模式
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理

Redis单机版安装配置

Redis下载

  • 官网地址:http://redis.io/
  • 中文官网地址:http://www.redis.cn/
  • 下载地址:http://download.redis.io/releases/

Redis安装

  • Linux环境为CentOS 7

  • 第一步:安装C语言需要的GCC环境

    yum install -y gcc-c++
    yum install -y wget
    
  • 第二部:下载并解压Redis源码压缩包

    #下载Redis
    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    #解压
    tar -zxvf redis-5.0.5.tar.gz 
    
  • 第三部:编译Redis源码,进入redis解压目录,执行编译命令

    cd redis-5.0.5
    #执行编译
    make
    
  • 第四部:安装Redis,需要通过PREFIX指定安装路径

    make install PREFIX=/mysoft/server/redis
    

安装中出现的问题

  • 执行make后出现

在这里插入图片描述

原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。解决办法:make时添加参数。

make MALLOC=libc

Redis启动

前端启动
  • 启动命令:redis-server,直接运行bin/redis-server将以前端模式启动

    ./redis-server
    
  • 关闭命令:ctrl+c

  • 启动缺点:客户端窗口关闭则redis-server程序结束、不推荐使用此方法

  • 启动图例:

在这里插入图片描述

后端启动(守护进程启动)
  • 第一步:拷贝redis解压目录中的redis.conf配置文件到Redis安装目录的bin目录下

    cp redis.conf /mysoft/server/redis/bin
    
  • 第二部:修改redis.conf,进入/mysoft/server/redis/bin

    vim redis.conf
    
    #将`daemonize`由`no`改为`yes`  
    daemonize yes    
    # 默认绑定的是回环地址,默认不能被其他机器访问  
    # bind 127.0.0.1    
    # 是否开启保护模式,由yes该为no  
    protected-mode no
    #设置密码
    requirepass 密码
    
  • 第三部:启动服务

    ./redis-server redis.conf
    
后端启动的关闭方式
./redis-cli shutdown
其他命令说明
redis-server:启动redis服务
redis-cli:进入redis命令客户端
redis-benchmark:性能测试的工具
redis-check-aof:aof文件进行检查的工具
redis-check-dump:rdb文件进行检查的工具
redis-sentinel:启动哨兵监控服务
Redis命令行客户端
  • 命令格式

    ./redis-cli -h 127.0.0.1 -p 6379
    #参数说明
    #-h:redis服务器的IP地址
    #-p:redis实例的端口号
    
  • 默认方式

    如果不指定主机和端口号也可以

    ./redis-cli
    
    • 默认主机地址是127.0.0.1
    • 默认端口是6379

Redis数据类型

官方命令大全网址:http://www.redis.cn/commands.html

Redis中存储数据是通过key-value格式存储数据的,其中value可以定义五种数据类型:

  • String(字符类型)**
  • Hash(散列类型)
  • List(列表类型)
  • Set(集合类型)
  • SortedSet(有序集合类型,简称zset)

**注意:**在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。

类型使用例子

String类型
赋值
  • 语法
set key value
  • 示例

[外链图片转存失败(img-nLWQPwFC-1566455165536)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562746160648.png)]

取值
  • 语法
get key
  • 示例

[外链图片转存失败(img-DtxoZKZv-1566455165537)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562746256208.png)]

取值并赋值
  • 语法
getset key value
  • 示例

[外链图片转存失败(img-ZuYJWUPK-1566455165537)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562746330496.png)]

数值增减

注意事项:

  • 当value为整数数据时,才能使用以下命令操作数值的增减
  • 数值递增都是【原子】操作
  • redis中的每一个单独的命令都是原子性操作。当多个命令一起执行的时候,就不能保证原子性,不过我们可以使用事务和lua脚本来保证这一点
递增数字
  • 语法
incr key
  • 示例

[外链图片转存失败(img-zeLV6K2v-1566455165538)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562746970392.png)]


增加指定的整数(即每次加几)
  • 语法
incrby key increment
  • 示例

[外链图片转存失败(img-VfcQ8xr9-1566455165538)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562747186432.png)]

递减数值
  • 语法
decr key
  • 示例

[外链图片转存失败(img-IBxz7maM-1566455165539)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562747273392.png)]

减少指定的整数
  • 语法
decrby key decrement
  • 示例

[外链图片转存失败(img-MV0A0ZnZ-1566455165540)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562747334104.png)]

仅当不存在时赋值
  • 语法
setnx key value
  • 示例

[外链图片转存失败(img-M01fbga0-1566455165541)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562748316631.png)]

其他命令
  • 向尾部追加值
append key value
#如果键不存在则将该键的值设置为value,即相当于 set key value 返回值是追加后字符串的总长度
  • 获取字符串长度
strlen key
  • 同时设置/获取多个键值
mset key value [key value...]
mget key [key...]

[外链图片转存失败(img-hNur7FZU-1566455165541)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562749059766.png)]

应用场景之自增主键
  • 需求:商品编号、订单号 采用incr命令生成
  • 设计:key命名要有一定的设计
  • 实现:定义商品编号key:items:id
incr items:id

[外链图片转存失败(img-RpWKlHWg-1566455165541)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562749341527.png)]

hash类型
hash类型介绍

hash类型也叫 散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其他类型。如下:

[外链图片转存失败(img-lwMH6R3p-1566455165542)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562751120467.png)]

赋值

hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,当执行更新操作时返回0

设置一个字段值
  • 语法
hset key field value
  • 示例

[外链图片转存失败(img-9XnMc6W8-1566455165542)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562751824494.png)]

设置多个字段值
  • 语法
hmset key field value [field value...]
  • 示例

[外链图片转存失败(img-4rd1qFzx-1566455165543)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562751956309.png)]

当字段不存在时赋值
  • 语法
hsetnx key field value
  • 示例

[外链图片转存失败(img-WJMvK56g-1566455165543)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752284245.png)]

取值
获取一个字段值
  • 语法
hget key field
  • 示例

[外链图片转存失败(img-cNxsHgfj-1566455165544)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752352997.png)]

获取多个字段值
  • 语法
hmget key field [field...]
  • 示例

[外链图片转存失败(img-HXv3vtVL-1566455165544)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752440053.png)]

获取所有字段值
  • 语法
hgetall key
  • 示例

[外链图片转存失败(img-GhF51qda-1566455165545)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752510045.png)]

删除字段
  • 语法
hdel key field [dield...]
  • 示例

[外链图片转存失败(img-Cs2UATj9-1566455165545)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752605245.png)]

增加数字
  • 语法
hincrby key field increment
  • 示例

将用户的年龄加2

[外链图片转存失败(img-Ix7haBt8-1566455165546)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752741116.png)]

其他命令
判断字段是否存在
  • 语法
hexists key field
  • 示例

[外链图片转存失败(img-psr7yK5v-1566455165546)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752816349.png)]

只获取所有字段名或字段值
  • 语法
hkeys key
hvals key
  • 示例

[外链图片转存失败(img-EBp4LdE1-1566455165546)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562752931301.png)]

获取字段数量
  • 语法
hlen key
  • 示例

[外链图片转存失败(img-gaULyuZD-1566455165547)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562753041957.png)]

获取某个hash所有的信息
  • 语法
hgetall key
  • 示例

[外链图片转存失败(img-e639PWVl-1566455165547)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562753199876.png)]

string类型和hash类型的区别

hash类型适合存储那些对象数据,特别是对象属性经常发生变化【增删改】操作的数据。string类型也可以存储对象数据,将java对象转换成json字符串进行存储,这种存储适合【查询】操作。

ArrayList与LinkedList的区别

ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。

LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是修改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或者后几个元素速度比较快。

img

img

list类型
list类型介绍

Redis的列表类型(list类型)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一片段。

列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。

lpush/rpush
  • 语法
lpush key value [value...] #将一个值插入到已存在的列表头部(最左边)
rpush key value [value...] #将一个值插入到已存在的列表尾部(最右边)
  • 示例

    • lpush

    [外链图片转存失败(img-QhifGvWy-1566455165550)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562859176477.png)]

    • rpush

    [外链图片转存失败(img-a3eKgMnj-1566455165551)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562859292497.png)]

lrange

获取列表中的某一片段。将返回start、stop之间的所有元素(包含两端的元素),索引从‘0’开始。索引可以是负数,如‘-1’ 代表最后边的一个元素

  • 语法
lrange key start stop
  • 示例

[外链图片转存失败(img-noP9ZXBc-1566455165551)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562859606321.png)]

lpop/rpop
从列表两端弹出元素
从列表左边弹出一个元素,会分两步完成:
- 第一步是将列表左边的元素从列表中移除
- 第二步是返回被移除的元素值
  • 语法
lpop key
rpop key
  • 示例

[外链图片转存失败(img-vWlopm1Y-1566455165551)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562859896813.png)]

llen 获取列表中元素个数
  • 语法
llen key
  • 示例

[外链图片转存失败(img-iKOESrPc-1566455165552)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562859968702.png)]

其他命令
lrem 删除列表中指定个数的值
lrem命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值得不同,该命令得执行方式会有所不同:
	1.当count>0时,lrem会从列表左侧开始删除,删除count个
	2.当count<0时,lrem会从列表右侧开始删除,删除|count|个
	3.当count=0时,lrem删除所有值为value的元素
  • 语法
lrem key count value
  • 示例

    • count大于0

    [外链图片转存失败(img-RKs6aQAX-1566455165552)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562860349232.png)]

    • count小于0

    [外链图片转存失败(img-6CHB5hye-1566455165553)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562860571416.png)]

lindex 获取指定索引的元素

注意:(索引从0开始)

  • 语法
lindex key index
  • 示例

[外链图片转存失败(img-N1kghybi-1566455165553)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562860671499.png)]

linsert 向列表插入元素

该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数时before还是after来决定将value插入到该pivot元素的前面还是后面

  • 语法
linsert list before|after pivot value
  • 示例

[外链图片转存失败(img-Vu7QObaH-1566455165554)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562860896379.png)]

rpoplpush 移动元素

将元素从一个列表转移到另一个列表中(从source的右边取一个元素移到distination的左边)

  • 语法
rpoplpush source distination
  • 示例

[外链图片转存失败(img-GclpFziA-1566455165554)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1562861053525.png)]

set类型
set类型介绍

set类型即 集合类型,其中的数据是 不重复且没有顺序

集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为O(1)

sadd/srem 添加元素/删除元素
  • 语法
sadd key member [member...]
srem key member [member...]
  • 示例

[外链图片转存失败(img-xcwfArkl-1566455165555)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563005743405.png)]

smembers 获得集合中的所有元素
  • 语法
smembers key
  • 示例

[外链图片转存失败(img-aS0qI9ZX-1566455165555)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563005789556.png)]

sismember 判断元素是否存在集合中
  • 语法
sismember key member
  • 示例

[外链图片转存失败(img-pYBvRfAS-1566455165556)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563005914766.png)]

集合运算命令
sdiff 集合的差集运算

- A-B:属于A并不属于B的元素构成的集合

  • 语法
sdiff key [key...]
  • 示例

A:[2,3,4,5,6] B:[4,5,6,7,8]

[外链图片转存失败(img-AaTIZ1CS-1566455165556)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563006275119.png)]

sinter 集合的交集运算

- A∩B:属于A且属于B的元素构成的集合

  • 语法
sinter key [key...]
  • 示例

A:[2,3,4,5,6] B:[4,5,6,7,8]

[外链图片转存失败(img-j38OrwSU-1566455165556)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563006731661.png)]

sunion 集合的并集运算

-A∪B:属于A或者属于B的元素构成的集合

  • 语法
sunion key [key...]
  • 示例

A:[2,3,4,5,6] B:[4,5,6,7,8]

[外链图片转存失败(img-KGByOVqj-1566455165557)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563006864357.png)]

其他命令
scard 获得集合元素的个数
  • 语法
scard key
  • 示例

[外链图片转存失败(img-WyJi1PV2-1566455165557)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563006992391.png)]

spop 从集合中弹出一个元素

**注意:**由于集合是无序的,所以spop命令会从集合中随机选择一个元素弹出

  • 语法
spop key
  • 示例

[外链图片转存失败(img-S7d0dpD4-1566455165558)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563007151652.png)]

zset类型(sortedset)
zset介绍

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

zset和list相似与差异

有序集合类型(zset)和列表类型(list)的相似和区别

  • 相似
    • 二者都是有序的
    • 二者都可以获得某一范围的元素
  • 区别
    • 列表类型是通过链表实现的,获取靠近两端的数据速度快,而当元素增多后,访问中间数据的速度会变慢
    • 有序集合类型使用散列表实现,所以即使读取中间部分的数据也很快
    • 列表中不能简单的调整某个元素的位置,但是有序的集合可以(通过改变分数实现)
    • 有序集合要比列表类型更耗内存
zadd 添加元素

向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会使用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素(即:如果之前存在lisi 再进行添加 返回值是 0)

  • 语法
zadd key score member [score member...]
  • 示例

[外链图片转存失败(img-U2CF2hDi-1566455165558)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563008568191.png)]

zrange/zrevrange
获得排名在某个范围的元素列表(即获取 第start到第stop之间的元素)
 - zrange:按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
 - zrevrange:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端)
  • 语法
zrange key start stop  [WITHSCORES] 
zrevrange key start stop  [WITHSCORES] 
  • 示例

[外链图片转存失败(img-LPQxR3fk-1566455165559)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563009061981.png)]

  • 注意:如果需要获取元素的分数,可以在命令尾部加上withscores

[外链图片转存失败(img-5dVyELDP-1566455165559)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563009278998.png)]

zscore 获取元素的分数
  • 语法
zscore key member
  • 示例

[外链图片转存失败(img-xQJExvSe-1566455165560)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563009475315.png)]

zrem 删除元素

移除有序集合key中的一个或多个成员,不存在的成员将被忽略。

当key存在但不是有序集合类型时,返回一个错误

  • 语法
zrem key member [member...]
  • 示例 (第一个是正常的 第二个key不是zset类型)

[外链图片转存失败(img-rzKHTBvX-1566455165560)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563010218058.png)]

其他命令
zrangebyscore

获取指定分数范围的元素

  • 语法
zrangebyscore key min max [withscores]
  • 示例

[外链图片转存失败(img-QcHNeWpC-1566455165561)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563010597195.png)]

zincrby

增加某个元素的分数 返回值是更改后的分数

  • 语法
zincrby key increment member
  • 示例

[外链图片转存失败(img-uY9DhhQx-1566455165561)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563012296178.png)]

zcard

获取集合中元素个数

  • 语法
zcard key
zcount

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

  • 语法
zcount key min max
zremrangebyrank

按照排名范围删除元素

  • 语法
zremrangebyrank key start stop
  • 示例

[外链图片转存失败(img-kAl7ewK0-1566455165562)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563012780945.png)]

zremrangebyscore

按照分数范围删除元素

  • 语法
zremrangebyscore key min max

通用命令

keys

返回满足给定pattern 的所有key

  • 语法
keys pattern
  • 示例

[外链图片转存失败(img-OZM2Vw9W-1566455165562)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563013022636.png)]

del

删除指定key

  • 语法
del key [key...]
  • 示例

[外链图片转存失败(img-xmPPgOiQ-1566455165563)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563013120192.png)]

exists

确认一个key是否存在,返回值为存在的个数

  • 语法
exists key [key...]
  • 示例

[外链图片转存失败(img-XglLFLKa-1566455165563)(C:\Users\MY\AppData\Roaming\Typora\typora-user-images\1563013220757.png)]

expire(重点)

设置缓存到期时间

  • 语法
expire key seconds  #设置key的生存时间(单位:秒)key在多少秒后会自动删除
ttl key  #查看key剩余的生存时间
persist key #清除生存时间
pexpire key milliseconds #设置生存时间(单位:毫秒)
rename

重命名key

  • 语法
rename oldkey newkey
type

显示指定key的数据类型

  • 语法
type key
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值