#数据库-Redis

Wee6-第5天:Redis

安装

$ sudo apt install redis-server -y 

安装成功后

Setting up redis-server (5:4.0.9-1ubuntu0.2) ...
Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.
Processing triggers for systemd (237-3ubuntu10.19) ...
Processing triggers for ureadahead (0.100.0-20) ...

查看redis服务的状态

$ sudo service redis status

redis配置文件位置:

$ sudo vi /etc/redis/redis.conf

database 16 表示默认有16个库,从0开始, 切换库可以使用

127.0.0.1:6379 > select 8

port 6379 端口号

redis的日志文件

$ sudo cat /var/log/redis/redis-server.log

连接redis

$ redis-cli
127.0.0.1:6379>

退出redis的连接

127.0.0.1:6379> exit

连接远程的redis

$ redis-cli -h 10.36.174.90
10.36.174.90:6379>

确定redis的配置文件中的69行的bind 127.0.0.1 改成0.0.0.0, 且重新启动redis服务。

$ sudo service redis restart

设置授权口令

$ sudo vi /etc/redis/redis.conf

....
# requirepass foobared
....

通过查询: /reqiurepass 找到设置口令的位置,将内容改为

requirepass disen666

修改之后保存并重新服务

带口令的方式连接redis服务

$ redis-cli -a disen666 -h 10.36.174.19
127.0.0.1:6379> keys *

可以正常显示查询的所有key对象。

Redis的持久化方式

  1. RDB 数据存储

    将内存的数据保存到硬盘中。

    在配置文件中使用save 配置项。 save

  2. AOF 追加日志方式

    每条命令都会写到日志中,通过日志的追加方式来存储的数据。

    还原数据,则重新执行日志中的命令。

    在配置文件中使用 appendonly 或appendfilename 等相关项配置。

数据类型

数据类型是指key对象的value值的类型

  1. string 字符串类型
  2. list列表类型
  3. hash(字典)类型
  4. set集合类型
  5. zset有序集合类型

基本操作

查看、删除、过期时间

  1. 查看 keys

    > keys * 
    

    *表示所有(任意长度任意字符),如:查询key对象名中包含 version的字符所有对象。

    > keys *version*
    
  2. 删除key对象

    > del key1 [key2 ...]
    

    del 删除key对象,可以同时删除多个key

  3. 设置key的过期时间

    > set token abc123 ex 10
    

    设置key对象value时通过ex 设置key的过期时间, 时间单位: 秒

    查看key的过期时间(剩余的时间)

    > ttl token 
    

    别外,通过expire命令设置key的过期时间

    > set token abc123
    > expire token 30
    > ttl token
    > get token 
    

    设置token的过期时间为30秒

刷新库

> flushdb 

刷新当前选择的库的所有key对象,即删除或清空当前库

> flushall

刷新所库的所有key对象,即删除或清空16个库。

查看key对象的类型

> type token

查看token的对象类型, 即token对象的value值类型.

string类型操作

  1. 增加key

    set key value [ex seconds]

    > set name disen ex 20
    
  2. 读取key

    get key

    > get name
    
  3. 批量增加和读取

    语法:

    mset key value [key value …]

    mget key [key …]

    > mset name disen age 20 city 西安 salary 3000
    > mget name age city
    1) "disen"
    2) "20"
    3) "\xe8\xa5\xbf\xe5\xae\x89"
    
  4. 自增与自减

    语法:

    incr key # 自增1

    incrby key number # 自增number

    decr key # 自减1

    decrby key number # 自减number

    > set stock 100
    > incr stock
    101
    
    > incrby stock 100
    201
    
    > decr stock
    200
    > decrby stock 10
    190
    
  5. 追加字符串和截取字符串

    语法:

    ​ append key 新字符串

    ​ substr key start end # 截取字符串

    > set name disen
    > append name ,19,3000
    > get name
    disen,19,3000
    
    > substr name -4 -1
    3000
    

    截取字符串可以使用负数,即从右边开始。

list操作

list类型即表示某一个key的value是list列表类型, 表示方式如: key [1, 2, 3, 4]

  1. 压入与弹出成员

    语法:

    ​ rpush key value [value …]

    ​ lpush key value [value …]

    ​ rpop key 从右边弹出一个元素

    ​ lpop key 从左边弹出一个元素

    > lpush user_token t1 t2 t3
    > lpop user_token
    t3
    > rpush user_token t9
    > lrange user_token 0 -1
    1) t2
    2) t1
    3) t9
    > rpop user_token
    t9
    
  2. 读取与删除

语法:

​ lrange key start end 如果start 为0, end -1 则表示所有的元素

​ lindex key index 查看指定index位置的元素

​ llen key 读取key的元素的长度或个数

​ ltrim key start end 截取 [start, end]的元素, 其它的元素则被删除

​ lrem key count value 删除key列表中count个value的元素

  1. 设置指定位置的值

    语法:

    ​ lset key index value 设置key中index位置元素值为value

    > LRANGE cart_1 0 -1
    1) "455"
    2) "650"
    3) "100"
    4) "2"
    > lset cart_1 1 651  # 修改cart_1 的第2个元素的值为651
    > lindex cart_1 1
    651
    

案例分析:

​ 通过redis的list实现高并发的用户秒杀业务的流程是:

​ key : buy_tasks

​ 成员的结构: user_id:datetime:goods_id:cnt

​ 会员从UI页中抢购:

​ 会员: 190001, 商品: 9008 / 西瓜 9Kg / 3份 , 20190815032015

​ 会员: 190002, 商品: 9009 / 西瓜 3Kg / 2份 , 20190815032017

​ 会员: 190003, 商品: 9010 / 西瓜 2.5Kg / 1份 , 20190815032019

> lpush buy_tasks 190001:20190815032015:9008:3
> lpush buy_tasks 190002:20190815032017:9009:2
> lpush buy_tasks 190003:20190815032019:9010:1

后端业务处理进程,从redis的任务队列中读取业务,并一一处理。

> rpop buy_tasks
190001:20190815032015:9008:3

set/zset集合操作

set集合的数据是无序的, 且不可重复;

list列表数据是有序的,且可以重复。

  1. 添加元素和删除元素

    语法:

    ​ sadd key member1 [member2 …] 添加一个或多个元素到key的集合对象中

    ​ srem key member 删除成员

    ​ spop key 随机返回一个成员,且删除

  2. 查看元素

    语法: smembers key 查看所有key集合中的元素

    ​ sismember key member 判断member是否在key 的集合中

    ​ srandmember key [ count ] 随机抽取count (默认为1)个的成员

  3. 集合交、并、差等运算

    语法:

    ​ sinter key1 key2 [key3 …] 交集

    ​ sinterstore dstkey key1 key2 [key3 …] 交集并保存到dstkey中

    ​ sunion key1 key2 [key3 …] 并集

    ​ sunionstore dstkey key1 key2 [key3 …] 并集并保存到dstkey中

    ​ sdiff key1 key2 … 差集

    ​ sdiffstore dstkey key1 key2 差集并保存到dstkey中

  4. zset有序集合

    • 添加元素

      语法: zadd key score member

      > zadd rank 1 9001
      

      score成员的排行的分数值,默认从小到大排序的。

    • 删除元素

      语法: zrem key member

      > zrem rank 9001
      
    • 查看元素

      语法: zrange key start end [withscores]

      ​ zrevrange key start end [withscores]

      withscores 显示成员的分数

      > zrevrange rank 0 2 withscores
      

      显示排行的前3名,且带有分数

    • 自增

      语法: zincrby key increment member

      increment 是指步长, 可以理解为分数。

      > zincrby rank 10000 9003
      

hash操作

hash结构是基于散列函数,实现的key:value的数据结构,key是唯一的, 只要key的哈希值是唯一即可。

案例分析:

​ 针对秒杀的结果进行存储, 规则中只秒杀100件, 每位用户只能1件

​ 解决方案: 使用redis的hash结构 存储秒杀结果。

​ key : qbuy_result_activeid

​ value-field: user_id

​ value_value: goods_id

假如 刚接收 190001:20190815032015:9008:3 秒杀任务信息, 首先判断当前

qbuy_result_activeid 中是否已达到100件

> hlen qbuy_result_activeid

经过程序代码的判断,没有达到100件,接下判断当前的用户是否已秒杀过。

> hexists qbuy_result_activeid 190001

经过判断之后,发现用户没有秒杀过,则存放结果如下:

> hset qbuy_result_activeid 190001 9008

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值