• redis 编译安装
  • 字符串
  • 列表
  • 集合
  • 哈希 Hash
  • 事务
  • 发布 订阅
  • 持久化
  • 给redis指定密码:
  • 其他机器连接redis:
  • python操作redis
  • Redis简单使用

    这篇关于redis的话题其实是对redis有个简单的操作,之前写的都是相当于介绍性的文章,没有操作,当然这些都是些简单操作,如果想深入,其实还是有很多东西要学习的。

    redis使用场景

    redis 编译安装

    连接redis

    redis-cli -h -p
    

    字符串

    添加值 :

    set key value EX timeout
    setex key time value
    
    127.0.0.1:6379> setex name 10 'andy'
    OK
    127.0.0.1:6379> ttl name  # ttl查看过期时间还剩下多少
    (integer) 6
    

    当前redis中所有的key:

    keys *
    

    删除

    del key
    

    设置过期时间

    expire key timeout # 单位为秒, 为已经添加到redis中的数据设置超时时间
    # 也可以在添加数据时设置超时时间
    set key value EX timeout
    setex key timeout value
    

    列表

    在列表左边添加元素

    lpush key value
    将值插入到key的表头,如果key不存在,一个空列表会被创建,并执行lpush,如果key存在但不是列表类型时会报错
    同理有rpush key value
    
    127.0.0.1:6379> lpush search google
    (integer) 1
    

    查看列表中的元素

    lrange key start stop  # 返回指定区间内的元素
    
    127.0.0.1:6379> lrange search 0 -1
    1) "google"
    127.0.0.1:6379> lpush search baidu
    (integer) 2
    127.0.0.1:6379> lrange search 0 -1
    1) "baidu"
    2) "google"
    

    移除并返回列表中元素

    #移除并返回列表key的头元素
    lpop search 
    
    127.0.0.1:6379> lpop search
    "baidu"
    

    通过索引获取 值

    lindex search 0
    
    127.0.0.1:6379> lindex search 0
    "google"
    

    获取 列表中元素个数

    llen search
    
    127.0.0.1:6379> llen search
    (integer) 1
    

    删除指定元素

    lrem key count value
    
    127.0.0.1:6379> lrange search 0 -1
    1) "baidu"
    2) "google"
    3) "baidu"
    127.0.0.1:6379> lrem search 2 baidu
    (integer) 2
    127.0.0.1:6379> lrange search 0 -1
    1) "google"
    
    根据参数count的值 移除列表中与参数value相等的元素count有三种情况
    
    count > 0: 从表头开始向表尾搜索,移除value相等的元素,个数为count
    count < 0: 从表尾开始向表头
    count = 0: 移除所有value
    

    集合

    添加元素 sadd set value1 value2

    localhost:6379> sadd school1 peking tsing
    (integer) 2
    

    查看元素 smembers set

    localhost:6379> smembers school1
    1) "tsing"
    2) "peking"
    

    移除元素 srem set memeber

    localhost:6379> srem school1 tsing
    (integer) 1
    localhost:6379> smembers school1
    1) "peking"
    

    查看集合中元素个数 scard

    localhost:6379> scard school1
    (integer) 1
    
    localhost:6379> smembers school1
    1) "yangtze"
    2) "tsing"
    3) "peking"
    localhost:6379> smembers school2
    1) "yangtze"
    2) "wuhan"
    3) "huake"
    

    获取交集sinter set1 set2

    localhost:6379> sinter school1 school2
    1) "yangtze"
    

    获取并集 sunion set1 set2

    localhost:6379> sunion school1 school2
    1) "yangtze"
    2) "wuhan"
    3) "tsing"
    4) "peking"
    5) "huake"
    

    获取差集sdiff set1 set2 注意前后顺序不同,结果可能不同

    localhost:6379> sdiff school1 school2
    1) "tsing"
    2) "peking"
    
    localhost:6379> sdiff school2 school1
    1) "wuhan"
    2) "huake"
    

    哈希 Hash

    添加hset key field value

    localhost:6379> hset person name 'andy' age 28
    (integer) 2
    

    获取hget key field

    localhost:6379> hget person name
    "andy"
    

    获取所有field valuehgetall key field

    localhost:6379> hgetall person
    1) "name"
    2) "andy"
    3) "age"
    4) "28"
    

    获取某个hash中所有的field hkeys key

    localhost:6379> hkeys person
    1) "name"
    2) "age"
    

    获取某个hash中所有的valuehvals key

    localhost:6379> hvals person
    1) "andy"
    2) "28"
    

    删除hdel key field

    localhost:6379> hset person school yangtze
    (integer) 1
    localhost:6379> hgetall person
    1) "name"
    2) "andy"
    3) "age"
    4) "28"
    5) "school"
    6) "yangtze"
    localhost:6379> hdel person school
    (integer) 1
    localhost:6379> hgetall person
    1) "name"
    2) "andy"
    3) "age"
    4) "28"
    

    判断是否存在某个值hexists key field

    localhost:6379> hexists person age
    (integer) 1
    

    获取hash中总共键值对hlen field

    localhost:6379> hlen person
    (integer) 2
    

    事务

    事务操作:redis 事务可以一次执行多个命令,事务具有以下特征: * 隔离操作:事务中的所有命令都会序列化,按照顺序插,不会被其它命令打扰 * 原子操作:事务中的命令要么全部执行成功,要么都不执行

    开启一个事务:multi后面执行的命令都在这个事务中执行 执行事务exec 将multi 与exec之间的所有命令执行 取消事务discard将multi后的所有命令取消 监视一个或者多个keywatch key 监视一个或多个key,如果在事务执行之前这个key被其它命令所改动,那么事务被打断,不会执行

    取消所有key的监视unwatch

    localhost:6379> hgetall person
    1) "name"
    2) "andy"
    3) "age"
    4) "28"
    5) "salary"
    6) "10000"
    localhost:6379> multi
    OK
    localhost:6379> hdel person salary
    QUEUED
    localhost:6379> exec
    1) (integer) 1
    localhost:6379> hgetall person
    1) "name"
    2) "andy"
    3) "age"
    4) "28"
    
    localhost:6379> multi
    OK
    localhost:6379> hset person age 29
    QUEUED
    localhost:6379> discard
    OK
    localhost:6379> exec
    (error) ERR EXEC without MULTI
    

    发布 订阅

    发布/订阅

    publish channel message
    subscribe channel
    

    持久化

    RDB同步机制:

    1. 开启和关闭:默认情况下是开启了。如果想关闭,那么注释掉redis.conf文件中的所有save选项就可以了。
    2. 同步机制:
      • save 900 1:如果在900s以内发生了1次数据更新操作,那么就会做一次同步操作。
      • save 300 10:如果在300s以内发生了10数据更新操作,那么就会做一次同步操作。
      • save 60 10000:如果在60s以内发生了10000数据更新操作,那么就会做一次同步操作。
    3. 存储内容:具体的值,而是命令。并且是经过压缩后存储进去的。
    4. 存储路径:根据redis.conf下的dir以及rdbfilename来指定的。默认是/var/lib/redis/dump.rdb
    5. 优点:
      • 存储数据到文件中会进行压缩,文件体积比aof小。
      • 因为存储的是redis具体的值,并且会经过压缩,因此在恢复的时候速度比AOF快。
      • 非常适用于备份。
    6. 缺点:
      • RDB在多少时间内发生了多少写操作的时候就会出发同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个Redis中的数据,因此你一般会设置在最少5分钟才保存一次数据。在这种情况下,一旦服务器故障,会造成5分钟的数据丢失。
      • 在数据保存进RDB的时候,Redis会fork出一个子进程用来同步,在数据量比较大的时候,可能会非常耗时。

    AOF同步机制:

    1. 开启和关闭:默认是关闭的。如果想要开启,那么修改redis.conf中的appendonly yes就可以了
    2. 同步机制:
      • appendfsync always:每次有数据更新操作,都会同步到文件中。
      • appendfsync everysec:每秒进行一次更新。
      • appendfsync no:使用操作系统的方式进行更新。普遍是30s更新一次。
    3. 存储内容:存储的是具体的命令。不会进行压缩。
    4. 存储路径:根据redis.conf下的dir以及appendfilename来指定的。默认是/var/lib/redis/appendonly.aof
    5. 优点:
      • AOF的策略是每秒钟或者每次发生写操作的时候都会同步,因此即使服务器故障,最多只会丢失1秒的数据。
      • AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只要添加新的数据进去就可以了。
      • 如果AOF文件比较大了,那么Redis会进行重写,只保留最小的命令集合。
    6. 缺点:
      • AOF文件因为没有压缩,因此体积比RDB大。
      • AOF是在每秒或者每次写操作都进行备份,因此如果并发量比较大,效率可能有点慢。
      • AOF文件因为存储的是命令,因此在灾难恢复的时候Redis会重新运行AOF中的命令,速度不及RDB。

    给redis指定密码:

    1. 设置密码:在redis.conf配置文件中,将requirepass pasword取消注释,并且指定你想设置的密码。
    2. 使用密码连接redis:
      • 先登录上去,然后再使用auth password命令进行授权。
      • 在连接的时候,通过-a参数指定密码进行连接。

    其他机器连接redis:

    如果想要让其他机器连接本机的redis服务器,那么应该在redis.conf配置文件中,指定bind 本机的ip地址。这样别的机器就能连接成功。不像是网上说的,要指定对方的ip地址。

    python操作redis

    安装pip install redis

    from redis import Redis
    
    cache = Redis(host='192.168.16.8',port=6379,password='password')
    
    
    cache.set('username','andy')
    username = cache.get('username')
    print(username)
    
    
    cache.lpush('school', 'yangtze')
    lmembers = cache.lrange('school', 0,-1)
    print(lmembers)
    
    cache.sadd('language', 'python')
    language = cache.smembers('language')
    print(language)
    
    cache.hset('search', 'baidu','www.baidu.com')
    search = cache.hget('search','baidu')
    print(search)
    
    """
    (flask_env)  ✘  /mnt/d/code/flask_alembic_demo  python py_redis.py
    b'andy'
    [b'yangtze', b'yangtze', b'yangtze', b'yangtze']
    {b'python'}
    b'www.baidu.com'
    """
    

    上一篇:Mysql 触发器

    下一篇:Memcached 简单了解