redis用法分析

redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的全部优点,而且在memcache的基础上增加了数据持久性功能,redis用rdb和aof两种方式实现数据持久性,在服务器突然宕机时也能几乎保留已存的全部数据。

当然,相比较memcache,它的数据库操作也较为复杂。

redis的应用场景和安装

redis除了可以用在memcache能用的地方,它还可以用在:

在官网(http://redis.io/)下载到它的最新版本,直接解压,因为redis官方已经编译过了,直接进行make / make test ,在make install时可以指定其安装路径。

$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar xzf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$ make

也可以使用对应平台的安装包工具进行安装。

安装完成后,将安装包里的redis的conf文件mv到安装目录的bin目录下,它是配置和启动redis所必需的。

除此,安装目录文件下src目录里还有如下文件。

redis-benchmark //性能测试工具 -n xxx 表示发出xxx条命令用来测试
redis-check-aof //检查aof日志的工具
redis-check-dump //检查rbd日志的工具
redis-cli //客户端
redis-server //redis的服务器进程
redis-sentinel //redis哨兵模式的进程

查看默认配置

cat  redis.conf |grep -v '^#'
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

我们用vim打开redis.conf来简单配置redis服务器。

将daemonize 选项改为yes来后台运行
database n 设置一个redis服务器里有n个服务器,默认为0-15共16个
port n 来设置redis服务器的监听端口
设置requirepass yourpassword来设置密码,客户端连接后用auth password来通过验证

我们使用./redis-server ./redis.conf命令来打开redis服务器。

使用./redis-cli [-p port]来连接服务器(默认6379)。

redis的命令

基本(包括string字符串类型)命令

set key value [ex|px n] //设置值[并设置过期时间为n秒/毫秒]
get key //获取值
del key //删除值
incby|decby key n //将key值自增或自减n
rename key newkey//覆盖原来的
select n//选择第n个数据库
ttl key //查询key的过期时间,-1表示永不过期,不存在的为-2
expire key n //设置key的过期时间为n秒
type key //获取key的存储类型
flushdb //清除当前数据库中的值
shutdown [nosave]//关闭服务器[不存储]

list(链表)命令

lpush/rpush list value1 [value2 value3...] //将value压入链表头/尾
lpop/rpop list //弹出链表头/尾的值
llen list //获取链表长度

set(集合)命令

zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序
zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示全部,[显示各个值的score]
zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置
zrem sorted_set key 删除有序集合中的key
zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个

sorted_set(有序集合)命令

zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序
zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示全部,[显示各个值的score]
zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置
zrem sorted_set key 删除有序集合中的key
zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个

hash(哈希类型)命令

hset hashset key value 设置hash表key的值为value
hget hashset key 获取hash表的key值
hdel hashset key 删除hash表中的一个key
hlen hashset 获取hash表的长度

redis的事务和发布、订阅

redis中的事务与mysql的类似,只有语句有些不同。

           redis        mysql
开始事务    multi      start transition
          事务中的query语句
执行事务    exec        commit
回滚事务    discard       roll back

对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。

watch key1 [key2...]

unwatch 取消所有监测。

redis原生发布和订阅功能,它类似于设计模式中的观察者模式,被订阅对象一旦发布了新的消息,那么所有订阅对象都会收到这条消息。使用方式为:

subscribe key //订阅某个key,如果这个key发布了新的消息,则会收听到
public key value//发布消息key,值为value,返回值是收到这个消息的人的个数
unsubscribe key //取消监听
psubscribe key1 key2/pattrn //[根据模式]监听多个key

redis的数据持久化

redis通过rdb和aof两种方式实现数据持久化,两种数据持久化方式都会占用CPU资源,拖慢redis的执行效率,一般两种模式配合使用。

rdb方式的主要原理就是达到某一写入条件后把内存中的所有数据的快照保存一份到磁盘上,数据恢复时用数据快照恢复。

aof方式是通过将每条redis执行命令记录入文本文件,恢复数据时重复执行记录的命令。

rdb方式实现数据持久化

用save/bgSave命令可以主动使用rdb方式[后台]存储rdb

修改redis.conf文件进行配置

save m n          //在m秒内有n次修改即进行一次快照,保存点很重要,一般会配置多个条件,满足其中之一就保存
stop-writes-on-bgsave-error yes //在进行快照的过程中如果出错,则停止写入
rdbcompression yes     //设置进行数据压缩
rdbchecksum yes       //导入数据时检查文件是否损坏
dbfilename xxx.rdb     //导出的文件名
dir path          //导出的文件路径

aof方式实现数据持久化

aof持久化的问题在于将每条指令都记录下来,即使是对一个键的反复操作,这样会导致aof文件越来越大,使用aof重写将会大大减小aof文件的体积,因为它是在最后将数据库内数据的状态统一逆化为命令,而不论一个key经过了多少次变化。使用 bgrewrite 命令可手动重写aof文件。

配置redis.conf文件:

noapppendfsync-on-rewrite yes    //设置导出rdb时停止写入aof,aof会被写在内存队列里,dump rdb 完成后统一进行写入操作。
appendfsync everysec        //每秒写入一次
appendfilename           //path/filename.aof
auto-aof-rewrite-percentage 100   //文件大小增长100%时重写
auto-aof-rewrite-min-size 64m    //文件至少达到64m时重写

redis的主从复制

主从复制时,主从都要以自己的.conf文件来启动服务器。主服务器可以将rdb关闭,以从服务器来产生rdb,加快主服务器的速度。

从服务器复制一个redis6380.conf文件,设置端口,pid存放文件,只读,主服务器的密码。

port 6380
pidfile filename
slave-read-only yes
masterauth password

设置完成后,分别用不同的conf文件打开服务器。

考虑到主服务器宕机的情况,我们用sentinel redis哨兵来监测服务器状态,在主服务器宕机之后做出反应。sentinel是redis集成的,我们只需要将安装包里的sentinel.conf文件拷贝到redis/bin目录下,使用redis-sentinel进程文件来启动服务器即可。

port 26379                    //sentinel监听的端口号
daemonize yes                  //后台启动进程
sentinel monitor mymaster 192.168.100.211 6379 2 //设置主进程ip和端口号,并设置两个哨兵发现主服务器长时间无法连接才判定其宕机
sentinel down-after-milliseconds mymaster 30000 //30000毫秒连接不上判定为无法连接
sentinel parallel-syncs mymaster 1        //一个主服务器打开时,同时复制的从服务器数,太大的话会造成服务器瞬间拥堵
sentinel failover-timeout mymaster 900000    //在90000秒内哨兵不再试图恢复原主服务器

安装好php的redis扩展后,就可以直接使用redis的类函数库了。

如下是典型的redis应用。

$redis=new Redis();           //实例化一个Redis对象
$redis->connect('host',port);      //连接redis服务器
$redis->auth('password');        //用密码认证
$redis->set($key,$value[,$expire_time]);//设置一个值
$content=$redis->get($key);       //获取值

首先安装redis

pip install redis

In [3]: import redis

In [4]: r = redis.Redis(host='localhost', port=6379, db=0)

In [5]: dir(r)
Out[5]:
['RESPONSE_CALLBACKS',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_georadiusgeneric',
 '_use_lua_lock',
 '_zaggregate',
 'append',
 'bgrewriteaof',
 'bgsave',
 'bitcount',
 'bitop',
 'bitpos',
 'blpop',
 'brpop',
 'brpoplpush',
 'client_getname',
 'client_kill',
 'client_list',
 'client_setname',
 'cluster',
 'config_get',
 'config_resetstat',
 'config_rewrite',
 'config_set',
 'connection_pool',
 'dbsize',
 'debug_object',
 'decr',
 'delete',
 'dump',
 'echo',
 'eval',
 'evalsha',
 'execute_command',
 'exists',
 'expire',
 'expireat',
 'flushall',
 'flushdb',
 'from_url',
 'geoadd',
 'geodist',
 'geohash',
 'geopos',
 'georadius',
 'georadiusbymember',
 'get',
 'getbit',
 'getrange',
 'getset',
 'hdel',
 'hexists',
 'hget',
 'hgetall',
 'hincrby',
 'hincrbyfloat',
 'hkeys',
 'hlen',
 'hmget',
 'hmset',
 'hscan',
 'hscan_iter',
 'hset',
 'hsetnx',
 'hstrlen',
 'hvals',
 'incr',
 'incrby',
 'incrbyfloat',
 'info',
 'keys',
 'lastsave',
 'lindex',
 'linsert',
 'llen',
 'lock',
 'lpop',
 'lpush',
 'lpushx',
 'lrange',
 'lrem',
 'lset',
 'ltrim',
 'mget',
 'move',
 'mset',
 'msetnx',
 'object',
 'parse_response',
 'persist',
 'pexpire',
 'pexpireat',
 'pfadd',
 'pfcount',
 'pfmerge',
 'ping',
 'pipeline',
 'psetex',
 'pttl',
 'publish',
 'pubsub',
 'pubsub_channels',
 'pubsub_numpat',
 'pubsub_numsub',
 'randomkey',
 'register_script',
 'rename',
 'renamenx',
 'response_callbacks',
 'restore',
 'rpop',
 'rpoplpush',
 'rpush',
 'rpushx',
 'sadd',
 'save',
 'scan',
 'scan_iter',
 'scard',
 'script_exists',
 'script_flush',
 'script_kill',
 'script_load',
 'sdiff',
 'sdiffstore',
 'sentinel',
 'sentinel_get_master_addr_by_name',
 'sentinel_master',
 'sentinel_masters',
 'sentinel_monitor',
 'sentinel_remove',
 'sentinel_sentinels',
 'sentinel_set',
 'sentinel_slaves',
 'set',
 'set_response_callback',
 'setbit',
 'setex',
 'setnx',
 'setrange',
 'shutdown',
 'sinter',
 'sinterstore',
 'sismember',
 'slaveof',
 'slowlog_get',
 'slowlog_len',
 'slowlog_reset',
 'smembers',
 'smove',
 'sort',
 'spop',
 'srandmember',
 'srem',
 'sscan',
 'sscan_iter',
 'strlen',
 'substr',
 'sunion',
 'sunionstore',
 'time',
 'touch',
 'transaction',
 'ttl',
 'type',
 'unwatch',
 'wait',
 'watch',
 'zadd',
 'zcard',
 'zcount',
 'zincrby',
 'zinterstore',
 'zlexcount',
 'zrange',
 'zrangebylex',
 'zrangebyscore',
 'zrank',
 'zrem',
 'zremrangebylex',
 'zremrangebyrank',
 'zremrangebyscore',
 'zrevrange',
 'zrevrangebylex',
 'zrevrangebyscore',
 'zrevrank',
 'zscan',
 'zscan_iter',
 'zscore',
 'zunionstore']

上面只是简单的介绍redis的使用,很多知识点都没有介绍。 后续有时间再按官方文档来一篇教程。

原文地址:https://www.jianshu.com/p/5c960c0bf6d3

Original: https://www.cnblogs.com/datiangou/p/10407978.html
Author: 大天狗子
Title: redis用法分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529322/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Sqlite_入门命令

    新建库 .open DATA_BASE;新建表 create table LIST_NAME(DATA);语法: NAME 关键字… 新建数据 insert into …

    Linux 2023年6月7日
    075
  • 高速USB转4串口产品设计-RS232串口

    基于480Mbps 高速USB转8路串口芯片CH344Q,可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动,也支持使用厂商提供的VCP串口驱动…

    Linux 2023年6月7日
    0107
  • Linux——基础命令用法(上)

    一、Linux基础命令 1、Linux命令的语法 一条完整的Linux命令的组成部分: 命令 选项 参数 命令:是某个具体的功能 选项:是对函数的修改(通常以-开头,-表示选项的短…

    Linux 2023年5月27日
    090
  • ES6

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &lt…

    Linux 2023年6月13日
    097
  • Centos下使用containerd管理容器:5分钟从docker转型到containerd

    一.系统环境 二.前言 三.containerd 四.部署containerd 4.1 安装containerd 4.2 containerd配置文件 4.3 配置containe…

    Linux 2023年6月7日
    0168
  • Redis的slot迁移

    1) 在目标节点B 上执行,从节点A 导入slot 到节点B : CLUSTER SETSLOT8 IMPORTING src– A-node-id 对于迁移的slot…

    Linux 2023年5月28日
    072
  • UWP 自定义密码框控件

    1. 概述 微软官方有提供自己的密码控件,但是控件默认的行为是输入密码,会立即显示掩码,比如 *。如果像查看真实的文本,需要按查看按钮。 而我现在自定义的密码控件是先显示你输入的字…

    Linux 2023年6月13日
    093
  • MySQL slow log 慢日志

    sql慢日志用于记录执行时间超过指定阈值的SQL,对于系统性能和故障排错非常有帮助 1.如何开启sql慢日志 –&#x5F00;&#x542F;slow log …

    Linux 2023年6月6日
    079
  • Linux的OpenLava配置

    OpenLava OpenLava是基于LSF早期的开源版本发展而来,其 免费、 开源、 兼容IBM LSF的工作负载调度器。当你需要执行某项业务时候(比如跑渲染之类的),当有服务…

    Linux 2023年6月6日
    0108
  • 学习一下 SpringCloud (一)– 从单体架构到微服务架构、代码拆分(maven 聚合)

    一、架构演变 1、系统架构、集群、分布式系统 简单理解 (1)什么是系统架构? 【什么是系统架构?】 系统架构 描述了 在应用程序内部,如何根据 业务、技术、灵活性、可扩展性、可维…

    Linux 2023年6月11日
    0101
  • [云原生]Kubernetes-Pod详解(第5章)

    一、Pod介绍 1.1 Pod结构 1.2 Pod定义 二、Pod配置 2.1 基本配置 2.2 镜像拉取 2.3 启动命令 2.4 环境变量 2.5 端口设置 2.6 资源配额 …

    Linux 2023年6月13日
    0148
  • python装饰器(新年第一写)

    祭奠碌碌无为的2018,想想其实也不算碌碌无为,至少我还搞懂了装饰器,写了一堆有用没用的玩意 原来觉得装饰器挺难的,直到2018年的最后几天,突然就明白了,难道这就是传说中的开天聪…

    Linux 2023年6月6日
    0105
  • Redis 集群

    三高架构:并发,性能,可用 主从复制 主从复制:将 master 中的数据即时、有效的复制到 slave 中 特征:一个 master 可以拥有多个 slave,一个 slave …

    Linux 2023年5月28日
    0111
  • ELK-企业级日志分析系统

    ELK 企业级日志分析系统 1.常见日志处理方式 rsyslog: Ryslog是一个强大而安全的日志处理系统。Rsylog通过多个物理或虚拟服务器在网络上接收日志,并监视不同服务…

    Linux 2023年6月13日
    095
  • Redis优化总结

    注意在redis.conf中的小聚合数据类型的特殊编码设置(http://carlosfu.iteye.com/blog/2254572) hash-max-zipmap-entr…

    Linux 2023年5月28日
    086
  • 我对二进制的理解

    理解进制的重要方法是类比我们熟知的十进制 10进制 一个正常的人类,拥有10根手指,每根手指代表1个信息,那么两双手掌便可表达10个信息。1, 2, 3, …, 10。…

    Linux 2023年6月7日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球