Redis基础

什么是Redis

Redis是用C语言开发的一个开源的高性能键值对数据库,它通过提供多种键值数据类型来适应不同场景下的存储需求

支持的数据类型:

  1. 字符串类型(String)
  2. 散列类型(hashMap )
  3. 列表类型(list)
  4. 集合类型(set)
  5. 有序集合类型(sortset)
  • 开启Redis

    1. 前端方式
      ./redis-server
    2. 后端方式
      ./redis-server redis.conf
  • 关闭Redis

    1. 直接关闭进程
      ps -ef | grep redis
      查找到和Redis相关的进程
      kill -9 pid
    2. 正常关闭
      ./redis-cli shutdown

Redis对外网端口开放

查看对外开放的端口状态

查看已经开放的端口状态  netstat -anp  
查询指定端口是否开放
firewall-cmd --query-port=6379/tcp  
注意:yes 表示开启 no 表示未开启  

查看防火墙状态

systemctl status firewalld  
开启防火墙:
systemctl start firewalld
关闭防火墙:
systemctl stop firewalld
开发服务
service firewalld start  

对外开放端口

添加端口
firewall-cmd --add-port=6379/tcp --permanent

Redis数据结构

介绍

  • redis是一种高级的key-value存储系统,其中value支持五种数据类型
    1. 字符串(String)
    2. 哈希(hash)
    3. 字符串列表(list)
    4. 字符串集合(set)
    5. 有序字符串集合(Sorted set)通过权重排序
  • 关于key的定义
    1. key 不要太长,不要超过1024个字节,会降低查找效率
    2. key 不要太短,太短会降低key的可读性
    3. key 有统一的命名规范

      存储String

      字符串类型是redis中最为基础的数据存储类型,它在Redis 中是二进制安全的,这意味着该类型存入和获取的数据相同,在Redis中字符串类型的Value最多可以容纳的数据长度是512M

赋值

set key value
set username  张三

取值

1.get key
  eg: get username
2.getset key value 先获取该key的值,然后再设置该key的值
    eg: getset name loong

删除

del key 删除指定key

数值增减(数字)

- incr   
    类似于i++ 
- decr  
    类似于i--
- incrby key increment  
    将指定的key 的value原子性增加increment  
    eg: incrby num 5  
- decrby key decrement  
    将指定的key 的value原子性减少decrement  
    eg: decrby num 3
- append key value  
    拼凑字符串,追加value
    eg: append username xxx

存储hash

具有String key 和 String value的map容器,适合存储值对象
每一个Hash可以存储4294967295个键值对

赋值

  • hset key field value
    为指定的key设定field/value对
    eg: hset myhash username jack
    hset myhash age 18
    
  • hmset key field value (field2 value2 …)
    设置key中的多个field/value
    eg: hmset myhash2 username rose age 21

取值

  • hget key field
    返回指定的key中的field的值
    eg: hget myhash username
  • hmget key field (field2)
    返回指定的key中的多个field的值
    eg: hmget myhash name age addr
    -hgetall key
    取出key所有的filed -value
    eg: hgetall myhash

删除

  • hdel key field (field2)
    删除hash中的某一个属性
    eg: hdel myhash age
  • hdelall key
    删除所有内容
  • del key
    删除整个key

增加

incrby key field increment 

其他

  • hexists key field
    判断指定key中的field是否存在
  • hlen key
    获取key所包含的field的数量
  • hkeys key
    获取所有的key
  • hvals key
    获取所有的value

存储list

添加

  • lpush key values [value1,value2…]
    在指定key所关联的list的头部插入所有的values
    头部插入数据,插入成功,返回元素的个数
  • rpush key values[value1,value2 ]
    在该list的尾部添加元素
    rpush mylist a b c d

    取值

  • lrange key start end
    获取链表中从start 到end的元素的值
    start ,end从0 开始计数,也可以为负数
    若为-1则表示链表尾部的元素
    eg: lrange mylist 0 5

两端弹出

  • lpop key
    返回并弹出指定的key关联的链表中的第一个元素(头部元素)
    如果不存在 ,返回nil ,如果key存在,则返回链表的头部元素
    lpop mylist
  • rpop key
    从尾部弹出元素
    eg: rpop mylist

    获取列表的元素的个数

  • llen key
    返回指定的key关联的链表中的元素的数量
    eg: llen mylist

扩展命令

  • lpushx key value
    仅当参数中指定的key存在时,向关联的list的头部插入value
    如果不存在,将不进行插入
  • rpushx key value
    在该list的尾部添加元素
  • lrem key count value
    删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素
    如果count 小于0 则从尾向头遍历并删除,如果count等于0,则删除链表中所有等于value的元素
    eg : lrem mylist 2 3 从头删除,2个数字3
  • lset key index value
    设置链表中的index的角标的元素值,0代表链表的头元素,-1代表链表的为元素操作链表的角标不存在则会抛出异常,相当于替换
    eg: lset mylist 3 444
  • linsert key before|after pivot value
    在pivot元素前或者元素后面插入value这个元素
    eg : linsert mylist after a yyy
  • rpoplpush resource destination
    将链表中的为尾部元素弹出并添加到头部元素(循环操作)
    eg: rpoplpush mylist1 mylist2
    将mylist1右端弹出 ,压入到mylist2的左边

存储Set

没有排序的字符集合,和list一样,可以执行添加,删除,修改等操作
和list不同的是,`set集合中不允许出现重复的元素`

添加

  • sadd key values[value1,value2…]
    向set中添加数据
    如果该key值已有则不会重复添加
    eg: sadd myset a b c

    删除

  • srem key membbers[member1,member2…]
    删除set中指定成员
    eg: srem myset 1 2

    获取元素

  • smembers key
    获取set中所有的成员
  • sismember key member
    判断参数中指定成员是否在该set中,1表示在,0 表示不在

    差集运算

  • sdiff key1 key2 key3 …
    返回key1和key2中相差的成员,而且与key的顺序有关,即返回差集
    属于key1 并且不属于key2的元素构成的集合

    交集运算

    sinter key1 key 2 key3 …
    返回交集
    属于key1并且属于key2的元素构成的集合
    eg: sinter myset1 myset2

    并集运算

    sunion key1 key2 key3 …
    返回并集
    属于key1或者属于key2的元素构成的集合

扩展命令

  • scard key
    获取set中成员的数量
    eg: scard myset
  • srandmember key
    随机返回一个set中的成员
    eg:srandmember myset
  • sdiffstore destination key1 key2 key3…
    将key1 ,key2相差的成员存储在destination上
    eg: sdiffstore myset myset1 myset2
  • sinterstore destination key[key…]
    将返回的交集存储在destination上
  • sunionstore destination key[key…]
    将返回的并集存储在destination上

存储sorted set

sorted set 和set 类型极为相似,都是字符串集合,都不允许重复的成员出现在一个setzhogn 他们之间的主要差别是sorted set中的每一个成员都会有一个分数与之关联,redis正是通过分数来为集合中的成员进行从小到大的顺序,同时分数是可以重复的

常用命令

  • 新增元素
    zadd key score number
  • 获得元素
    zscore key mumber
    返回指定成员的分数
  • 删除元素
    1. zrem key member[member…]
      移除集合中指定成员 可以指定多个成员
    2. zremrangebyrank key start stop
      按照排名范围删除元素
  • 范围查询

    1. zrange key start end [withscores];
      获得集合中角标为start - end 的成员
      [widthscores]:代表返回成员包含的分数
    2. zrevrange key start end [withscores];
      按照scores从大到小的顺序返回索引从start到stop之间的所有元素
  • 获得成员数量
    zcard -key

  • 设置指定成员增加的分数,返回值为跟更新后的分数
    zincrby key increment member
  • 获取分数在[min,max]之间的成员个数
    zcount key min max
  • 返回成员在集合中的排名(从小到大)
    zrank key member
  • 返回成员在集合中的排名(从大到小)
    zrevrank key member

Keys通用操作

keys pattern

获取所有与pattern匹配的key,返回所有与该key匹配的keys。
*代表任意一个或多个字符
? 代表任意一个字符

del key1 key2 …

删除指定的key
可以一次删除多个

exists key

判断该key 是否存在
1 代表存在
0 代表不存在

rename key newkey

为当前的key重命名

expire key 过期时间

设置过期时间
单位:秒s

ttl key

获取该key所剩的超时时间
如果没有设置超时 返回-1
如果返回-2 表示超时不存在

type key

获取指定key的类型
该命令将以字符串的格式返回
返回的字符串为String,list,set,hash和zset
如果key不存在返回none

Redis 特性

多数据库

一个redis可以提供16个数据库
下标从0 到15
客户端可以指定连接某个redis实例的哪个数据库
客户端默认连接0号数据库
也可以通过select选择连接哪个数据库
eg: select 1 选择1号数据库

  • 将newkey移植到1号库
    move newkey 1;
    将当前库的key移植到1号库中

服务器命令

  • ping
    测试连接是否存活
  • echo
    在命令行打印一些内容
    echo loong
  • select
    选择数据库
    redis数据库编号从0~15
    可以选择任意一个数据库来进行数据的存取
  • quit
    退出连接
  • dbsize
    返回当前数据库中key的数目
  • info
    获取服务器的信息和统计
  • flushdb
    删除当前选择数据库中的所有key
  • flushall
    删除所有数据库中的所有key

消息订阅与发布

  • 订阅频道
    subscribe channel
  • 批量订阅频道
    psubscribe channel;
    例: psubscribe s

    订阅以‘s’开头的频道
  • 发布消息
    publish channel content
    在指定的频道中发布消息
    例: publish mychat ‘today is good day’

    reis事务

  • mutil
    开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行exec时,这些命令才会被原子执行
  • exec
    提交事务 ,类似于关系型数据库中的:commit
  • discard
    事务回滚,类似于关系数据库中的rollback

redis持久化

redis的高性能是由于其将所有数据都存储在了内存中,为了使redis在重启之后任能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化

持久化方式

RDB方式(redis databases)

默认支持,无需配置  
在指定时间间隔内将内存中的数据集快照写入到磁盘  
Snapshot快照 ,它恢复时是将快照文件直接读到内存中  
如果需要进行大规模数据的恢复,并且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效
RDB的缺点

最后一次持久化后的数据可能丢失
fork的时候内存中需要保存两份数据

  • Rdb保存的是dump.rdb

AOF方式(append only file)

-------------本文结束,感谢您的阅读-------------
您的支持将鼓励我继续创作!!