Redis

redis 相关的可执行文件

  • redis-server Redis服务器

  • redis-cli Redis客户端

  • redis-benchmark Redis 性能测试工具

  • redis-check-aof AOF文件修复工具

  • redis-check-dump RDB文件检查工具


redis 启动关闭等操作

  • 直接启动
    redis-server --port 6379 // 默认使用 6379 端口
    redis-server /etc/redis/redis.conf // 指定配置文件

  • 通过初始化脚本启动
    在Redis源码包的utils文件中有 redis_init_script 初始化脚本文件
    我们需要配置redis的运行方式,持久化文件,日志文件的存储位置等
    通过一下步骤使redis随系统启动:
    > sudo cp utils/redis_init_script /etc/init.d/redis_6379
    > sudo mkdir /etc/redis # 存放redis的配置文件
    > sudo mkdir /var/redis/6379 # 存放redis的持久化文件
    修改配置文件:
    port = 6379 # 监听的端口号
    daemonize yes # 以守护进程模式运行
    dir /var/redis/6379 # 设置持久化文件存储位置
    pidfile /var/run/redis_6379.pid

  > sudo cp redis.conf /etc/redis/6379.conf
  > sudo update-rc.d redis_6379 defaults     # 使redis随系统自动启动
  • 停止redis
    redis-cli SHUTDOWN
  • redis-cli 客户端

    redis-cli -h 127.0.0.1 -p 6379
    redis-cli ping    # 测试连接是否正常
    redis-cli --raw    # 可以防止中文显示乱码
    

一个redis实例支持多个数据库,默认是16个。但每个数据库并不是完全隔离,例如FLUSHDB可以清空一个redis实例的所有数据库。因此不用的应用的数据应该存储在不同的redis实例中。

redis 键名最佳实践, 对象类型:对象ID:对象属性, 多单词推荐用逗号分隔
例如 user:1:friends


redis命令

利用命令批量删除key
> redis-cli KEYS "doctor:*" | xargs redis-cli DEL

系统级

DBSIZE # 获取键的数量
KEYS pattern # 获取符合规则的键名, pattern支持glob风格通配符格式:

?  匹配一个字符
*  匹配任意个字符
[]  匹配括号内的任意字符,可以使用 - 表示范围
\x  匹配x, 用于转义

CONFIG GET XXXX # 获取当前的配置值
SELECT n # 更换数据库,默认支持16个数据库, 默认是数据库0
EXISTS key # 判断一个键是否存在
DEL key [key ...] # 删除键
TYPE key # 获取键值的数据类型

字符串

SET key value
GET key
INCR key
DECR key

如何获得自增的ID: 对于每一类对象使用名为  对象类型(复数形式):count (例如 users:count ) 的键来存储当前对象的数量

INCRBY key increment # 增加指定的整数
DECRBY key decrement
INCRBYFLOAT key increment # 增加指定的浮点数
APPEND key value # 向键值的末尾追加 value, 若不存在则等同SET
STRLEN key # 获取字符串长度 (以utf-8编码时,一个中文长度是3)
MGET key [key ...]
MSET key value [key value ......]

位操作

GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end] # 获得字节范围内值是1的二进制个数
BITOP operation destkey key [key ...] # 位运算,包括 AND, OR, XOR, NOT

散列值

键, 字段, 字段值
HSET key field value
HGET key field
HMSET key field value [field value ......]
HMGET key field [field ......]
HGETALL key
HEXISTS key field # 判断一个字段是否存在
HSETNX key field value # 当字段不存在时,才执行赋值操作
HINCRBY key field increment
HDEL key field [field ......]
HKEYS key # 只获取字段名
HVALS key # 只获取字段值
HLEN key # 获取字段数量

列表

插入删除非常快,通过索引访问元素比较慢
LPUSH key value [value ......]
RPUSH key value [value ......]
LPOP key
RPOP key
LLEN key
LRANGE key start stop # 获取列表片段,包含两端的元素,支持负索引
LREM key count value # 删除指定的值

1> 当count>0, 从列表左边开始删除前count个值为value的元素
2> 当count<0, 从列表右边开始删除前|count|个值为value的元素
3> 当count=0, 删除所有值为value的元素

LINDEX key index # 获取指定索引的元素值
LSET key index value # 设置指定索引的元素值
LTRIM key start end # 只保留列表指定片段
LINSERT key BEFORE|AFTER pivot value # 向列表中指定元素的前/后插入元素
RPOPLPUSH source destination # 将元素从一个列表转移到另一个列表

集合

无序,唯一
SADD key member [member ......]
SREM key member [member ......]
SMEMBERS key # 获得集合中的所有元素
SISMEMBER key member # 判断是否是集合中的元素
SDIFF key [key ....] # 差集运算
SINTER key [key ...] # 交集运算
SUNION key [key ...] # 并集运算
SDIFFSTORE destination key [key ....] # 差集运算并存储结果
SINTERSTORE destination key [key ...] # 交集运算并存储结果
SUNIONSTORE destination key [key ...] # 并集运算并存储结果
SCARD key # 获取集合中的元素个数
SRANDMEMBER key [count] # 随机获取集合中的元素

  count>0 获取count个不重复的元素, count<0 获取count个可能重复的元素

SPOP key # 从集合中弹出一个元素

有序集合

有序,唯一,读取中间部分速度也很快
ZADD key score member [score member ....] # 加入一个元素和该元素的分数
ZSCORE key member # 获取元素的分数
ZRANGE key start stop [WITHSCORES] # 获取排名在指定范围内的元素列表,从小到大
ZREVRANGE key start stop [WITHSCORES] # 逆序
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] # 获得指定分数范围的元素,从小到大,包含两端。若在分数前加‘(’表示不包括端点。offset 和 count 类似SQL中的用法,即在结果集的基础上向后偏移offset并只取前count个元素

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] # 逆序
ZINCRBY key increment member # 增加某个元素的分数, 增量可以为负数,表示减去
ZCARD key # 获取集合中的元素数量
ZCOUNT key min max # 获取指定分数范围内的元素个数
ZREM key member [member ......]
ZREMRANGEBYRANK key start stop # 按照排名范围删除元素,从小到大
ZREMRANGEBYSCORE key start stop # 按照分数范围删除元素,从小到大
ZRANK key member # 获得元素排名, 从小到大
ZREVRANK key member

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGREGATE SUM|MIN|MAX] # 计算多个有序集合的交集并存储结果,destination中的分数由AGREGATE参数决定。当是SUM(默认值),分数为每个参与计算的集合中该元素分数的总和;当是MIN,分数是每个参与计算的集合中该元素分数的最小值;当是MAX,则是最大值。WEIGHTS为每个参与计算的集合的分数权重,计算时分数会乘上该集合的权重。

ZUNIONSTORE 同上类似


事务

MULTI
若干命令
EXEC

事务中的错误处理:
1> 若出现语法错误,则事务中的所有命令都不会执行
2> 若出现运行时错误,其他命令依然会执行

WATCH / UNWATCH 命令
WATCH 命令监控一个或多个键,一旦其中有一个键被修改或删除,之后的事务就不会执行。监控一直持续到EXEC命令, 执行EXEC命令会取消对所有键的监控,也可以使用 UNWATCH 命令取消监控

EXPIRE key seconds # 为键设置生存时间
TTL key # 获取键的生存时间, 返回-1表示永久存在, -2 表示不存在这个键
PERSIST key # 取消键的生存时间,即设置为永久,SET/GETSET 为键赋值也会取消生存时间
PEXPIRE key microseconds # 同EXPIRE,区别在于单位是毫秒
PTTL key

注: 如果WATCH一个有生存时间的键,当这个键过期被删除时,并不会被WATCH命令认为该键发生了改变


排序

  • SORT key [ALPHA] [DESC] [LIMIT offset count]
  • SORT key BY somekey[->somefiled] [DESC] [LIMIT offset count] GET somekey[->somefield] STORE new-key

配置文件

  • maxmemory 最大可使用内存大小,单位字节。当超出限制时会根据 maxmemory-policy 参数指定的策略来删除不需要的键。

  • maxmemory-policy 支持 volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction

  • maxmemory-samples 当内存不足时,每次删除的键的数量


Redis 管理工具

  • phpRedisAdmin
    安装步骤:
    > sudo apt-get install nginx # ubuntu12.04上nginx默认根目录在/var/share/nginx/html, 可以通过修改配置文件更改根目录
    nginx 相关命令
    > sudo service nginx start/stop/restart
    > sudo nginx
    > sudo ngix -s stop/reload
    > sudp apt-get install php5-fpm
    > sudo php-fpm   # 在OSX上需要手动启动该服务, 可能会出错需要修改配置文件/php-fpm.conf   

OSX上 php-fpm启动服务 参考文档

    > git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git
    > cd phpRedisAdmin
    > git submodule init
    > git submodule update
    > git clone https://github.com/nrk/predis.git vendor

当redis中的键数量过多时,可能会超出PHP的内存限制而出错。解除内存限制:
> vim vendor/src/Connection/StreamConnection.php
> 增加如下代码: ini_set('memory_limit','-1');

修改nginx配置文件中对php的配置:

   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

Redis与Mysql之间的数据同步

  • 第三方库: python-mysql-replication
    https://github.com/noplay/python-mysql-replication

这个库通过分析mysql的binlog可将mysql中的数据操作同步到Redis。
实际项目中需要修改 site-packages/pymysqlreplication/row_event.py 中的 176行:

    if column.character_set_name == 'utf8mb4':
        column.character_set_name = 'utf8'

你可能感兴趣的:(Redis)