zoukankan      html  css  js  c++  java
  • Redis命令

    redis的常用命令主要分为两个方面、一个是键值相关命令、一个是服务器相关命令(redis-cli进入终端)

    1、键值相关命令

          keys * 取出当前所有的key

          exists name 查看n是否有name这个key

          del name 删除key name

          expire confirm 100 设置confirm这个key100秒过期

          ttl confirm 获取confirm 这个key的有效时长

          select 0 选择到0数据库 redis默认的数据库是0~15一共16个数据库

          move confirm 1 将当前数据库中的key移动到其他的数据库中,这里就是把confire这个key从当前数据库中移动到1中

          persist confirm 移除confirm这个key的过期时间

          randomkey 随机返回数据库里面的一个key

          rename key2 key3 重命名key2 为key3

          type key2 返回key的数据类型

    2、服务器相关命令

          ping PONG返回响应是否连接成功

          echo 在命令行打印一些内容

          select 0~15 编号的数据库

          quit  /exit 退出客户端

          dbsize 返回当前数据库中所有key的数量

          info 返回redis的相关信息

          config get dir/* 实时传储收到的请求

          flushdb 删除当前选择数据库中的所有key

          flushall 删除所有数据库中的数据库

    ------------------------------------------------------

    一、Redis简介(数据存放在内存中但可以持久化)

    1. 简介

    Redis是一种面向“键/值”对数据类型的内存数据库

    redis的键只能是字符串

    redis的值支持多种数据类型:

    1:字符串 string

    2:哈希 hash

    3:字符串列表 list

    4:字符串集合 set 不重复,无序

    5:有序集合sorted set  ,不重复,有序

    6:HyperLogLog 结构(redis2.8.9版本之后才有,用来做基数统计的算法。)

    2.特点

    高性能(Redis读的速度是11W次/s,写的速度是8.1W次/s)
    原子性(保证数据的准确性)
    持久存储(两种方式RDB/快照,AOF/日志)
    主从结构(master-slave,负载均衡,高可用)
    集群(3.0版本)

    3. 应用

    应用在高并发和实时请求的场景。
    新浪微博
    hash:关注列表,粉丝列表
    string:微博数,粉丝数(避免使用select count(*) from...)
    sorted set:TopN,热门微博

    4.reids特性多数据库

    名称不能更改

    每个数据库对外都是以一个从0开始的递增数字命名,不支持自定义的   
    redis默认支持16个数据库,可以通过修改databases参数来修改这个默认值
    redis默认选择的是0号数据库
    SELECT 数字: 可以切换数据库
    多个数据库之间并不是完全隔离的,flushall

    二、Redis 命令

    1.基础命令

    获得符合规则的键名称
    keys 表达式(?,* ,[],?)
    判断一个键是否存在
    exists key
    删除键
    del key
    del key1 key2
    批量删除
    redis-cli del `redis-cli keys "key*"`
    获得键值的数据类型type
    返回值可能是这五种类型(string,hash,list,set,zset)
    注意:redis不区分命令大小写

    2.redis的help命令

    "help @<group>" to get a list of commands in <group>

    "help <command>" for help on <command>

    "help <tab>" to get a list of possible help topics

    "quit" to exit

    3.redis数据类型之string

    字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB
    命令
    set/get(setnx)
    mset/mget
    incr/decr/incrby/decrby/incrbyfloat
    append
    strlen

    4.redis数据类型之hash

    hash类型的值存储了字段和字段值的映射,字段值只能是字符串,不支持其他数据类型。hash类型的键至多可以存储       个字段。
    hash类型适合存储对象:如图:1-1和1-2
    redis可以为任何键增减字段而不影响其他键
    命令
    hset/hget/hmset/hmget/hgetall(hsetnx)
    hexists,判断键中的属性是否存在
    hincrby(hash类型没有hincr命令)
    hdel
    hkeys/hvals
    hlen(获取键中包含多少个字段)

    5.redis数据类型之list

    list是一个有序的字符串列表,列表内部实现是使用双向链表(linked list)实现的。
    list还可以作为队列使用(后面讲)
    一个列表类型的键最多能容纳           个元素。
    命令
    lpush/rpush/lpop/rpop
    llen/lrange(-1表示最后一个元素的位置)
    lrem(lrem key count value)count分为三种情况
    count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    count = 0 : 移除表中所有与 value 相等的值。
    lindex(查询指定角标数据)
    lset(修改)
    ltrim(截取)
    linsert(向指定元素前后插入元素)
    rpoplpush:将元素从一个列表转到另一个列表

    6.redis数据类型之set

    set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多        个元素
    set集合类型和list列表类型的相似之处,如图:2-1所示
    命令
    sadd/smembers/srem/sismember
    sdiff/sinter(交集)/sunion(并集)
    sdiffstore/sinterstore/sunionstore
    scard(获取集合长度)/spop(随机从集合中取出并删除一个元素)
    srandmember key [count]
    如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
    如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

    7.redis数据类型之sorted set

    有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。
    有序集合类型和列表类型的差异:见备注
    命令
    zadd/zscore/zrange/zrevrange/
    zrangebyscore(默认是闭区间,可使用"("使用开区间)
    zincrby/zcard/zcount(获取指定分数范围的元素个数)
    zrem/zremrangebyrank/zremrangebyscore
    扩展:+inf(正无穷)    -inf(负无穷)

    8.redis数据类型之HyperLogLog

    Redis HyperLogLog 是用来做基数统计的算法。
    优点:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。因为在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
    缺点:因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
    命令
    pfadd key element [element ...]
    pfcount key [key ...]
    pfmerge destkey sourcekey [sourcekey ...]

    9.易错点

    set命令
    (如果 key 已经持有其他类型值, SET 就覆盖旧值,无视类型。)

    10.java操作redis

    使用jedis第三方jar包操作redis
    mvn依赖

    <dependency>                               <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.0</version>
    </dependency>

    数据库连接方式:

    1.单机单连接方式
    2.单机连接池方式
    3.多机分布式+连接池方式

    11.提取redisutils工具类

    image

    12.redis中键的生存时间(expire)

    redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。
    expire    设置生存时间(单位/秒)
    pexpire设置生存时间(单位/毫秒)
    ttl/pttl    查看键的剩余生存时间
    persist    取消生存时间
    expireat [key] unix时间戳1351858600
    pexpireat [key] unix时间戳(毫秒)1351858700000


    应用场景:
    限时的优惠活动
    网站数据缓存(对于一些需要定时更新的数据)
    限制网站访客访问频率(例如:1分钟最多访问10次)

    13.redis的事务(transaction)(一组命令要么都执行要么都不执行)

    redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单元。一组事务中的命令要么都执行,要么都不执行。(例如:转账)
    原理:先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。
    应用场景
    一组命令必须同时都执行,或者都不执行。
    我们想要保证一组命令在执行的过程之中不被其它命令插入。
    命令
    multi    事务开始
    .....
    exec    事务结束,开始执行事务中的命令
    discard    放弃事务
    错误处理
    1:语法错误:致命的错误,事务中的所有命令都不会执行
    2:运行错误:不会影响事务中其他命令的执行
    Redis 不支持回滚(roll back)
    正因为redis不支持回滚功能,才使得redis在事务上可以保持简洁和快速。
    java代码手工实现incr递增命令
    watch命令
    作用:监控一个或者多个键,当被监控的键值被修改后阻止之后的一个事务的执行。
    但是不能保证其它客户端不修改这一键值,所以我们需要在事务执行失败后重新执行事务中的命令。
    注意:执行完事务的exec或者discard命令之后,watch就会取消对所有键值的监控
    unwatch:取消监控

    14.redis中数据的排序(sort)

    sort命令可以对列表类型,集合类型和有序集合类型,进行排序。
    sort key [desc] [limit offset count]
    by 参考键(参考键可以是字符串类型或者是hash类型的某个字段,hash类型的格式为:键名->字段名)
    如果参考键中不带*号则不排序
    如果某个元素的参考键不存在,则默认参考键的值为0
    扩展 get参数
    get参数的规则和by参数的规则一样
    get # (返回元素本身的值)
    扩展 store参数
    使用store 参数可以把sort的排序结果保存到指定的列表中
    性能优化
    1:尽可能减少待排序键中元素的数量
    2:使用limit参数只获取需要的数据
    3:如果要排序的数据数量很大,尽可能使用store参数将结果缓存。

    15“发布/订阅”模式(类似网站更新后给你邮箱发消息)

    发布:publish
    例:publish channel message
    订阅:subscribe
    例:subscribe channel [.....]
    取消订阅:unsubscribe
    例:unsubscribe [channel]
    按照规则订阅:psubscribe
    例:psubscribe channel?
    按照规则取消订阅:punsubscribe
    注意:使用punsubscribe命令只能退订通过psubscribe 订阅的频道。

    16.redis任务队列

    任务队列:使用lpush和rpop(brpop)可以实现普通的任务队列。
    优先级队列:brpop key1 key2 key3 timeout second

    17.redis管道(pipeline)

    redis的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java的客户端(jedis)中是可以使用的。
    测试发现:
    1:不使用管道方式,插入1000条数据耗时328毫秒
    for (int i = 0; i < 1000; i++) {
    jedis.set("test"+i, "test"+i);
    }

    2:使用管道方式,插入1000条数据耗时37毫秒
    Pipeline pipelined = jedis.pipelined();
    for (int i = 0; i < 1000; i++) {
    pipelined.set("test"+i, "test"+i);
    }
    pipelined.sync();

    18.redis持久化(persistence)

    redis支持两种方式的持久化,可以单独使用或者结合起来使用。
    第一种:RDB方式(redis默认的持久化方式)
    第二种:AOF方式

    19.redis持久化之RDB

    rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件中。(文件名在配置文件中dbfilename)
    redis进行快照的时机(在配置文件redis.conf中)
    save 900 1:表示900秒内至少一个键被更改则进行快照。
    save 300 10
    save 60 10000
    redis自动实现快照的过程,见备注
    手动执行save或者bgsave命令让redis执行快照。
    两个命令的区别在于,save是由主进程进行快照操作,会阻塞其它请求。bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。
    文件修复:redis-check-dump
    rdb的优缺点
    优点:由于存储的有数据快照文件,恢复数据很方便。
    缺点:会丢失最后一次快照以后更改的所有数据。

    20.redis持久化之AOF

    aof方式的持久化是通过日志文件的方式。默认情况下redis没有开启aof,可以通过参数appendonly参数开启。
    appendonly yes
    aof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改
    appendfilename appendonly.aof
    redis写命令同步的时机
    appendfsync always 每次都会执行
    appendfsync everysec 默认 每秒执行一次同步操作(推荐,默认)
    appendfsync no不主动进行同步,由操作系统来做,30秒一次
    aof日志文件重写
    auto-aof-rewrite-percentage 100(当目前aof文件大小超过上一次重写时的aof文件大小的百分之多少时会再次进行重写,如果之前没有重写,则以启动时的aof文件大小为依据)
    auto-aof-rewrite-min-size 64mb
    手动执行bgrewriteaof进行重写
    重写的过程只和内存中的数据有关,和之前的aof文件无关。
    所谓的“重写”其实是一个有歧义的词语, 实际上, AOF 重写并不需要对原有的 AOF 文件进行任何写入和读取, 它针对的是数据库中键的当前值。
    文件修复:redis-check-aof
    动态切换redis持久方式,从 RDB 切换到 AOF(支持Redis 2.2及以上)
    CONFIG SET appendonly yes
    CONFIG SET save ""(可选)
    注意:当redis启动时,如果rdb持久化和aof持久化都打开了,那么程序会优先使用aof方式来恢复数据集,因为aof方式所保存的数据通常是最完整的。
    注意:如果想把正在运行的redis数据库,从    RDB切换到AOF,建议先使用动态切换方式,再修改配置文件,重启数据库。(不能自己修改配置文件,重启数据库,否则数据库中数据就为空了。)

    21.redis中的config命令

    使用config set可以动态设置参数信息,服务器重启之后就失效了。
    config set appendonly yes
    config set save "90 1 30 10 60 100"
    使用config get可以查看所有可以使用config set命令设置的参数
    config get *
    使用config rewrite命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写(Redis 2.8 及以上版本才可以使用),主要是把使用config set动态指定的命令保存到配置文件中。
    config rewrite
    注意:config rewrite命令对 redis.conf 文件的重写是原子性的, 并且是一致的: 如果重写出错或重写期间服务器崩溃, 那么重写失败, 原有 redis.conf 文件不会被修改。 如果重写成功, 那么 redis.conf 文件为重写后的新文件。

    22.redis的安全策略 (安全起见要放在内网中)

    设置数据库密码
    修改配置requirepass password
    验证密码auth password
    注意:在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。
    bind参数(可以让数据库只能在指定IP下访问)
    bind 127.0.0.1
    命令重命名
    修改命令的名称rename-command flushall cleanall
    禁用命令 rename-command flushall ""

    23.redis优化

    精简键名和键值
    键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名。
    键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong)
    当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能
    内部编码优化(了解)
    redis为每种数据类型都提供了两种内部编码方式,在不同的情况下redis会自动调整合适的编码方式。(如图所示)
    SLOWLOG [get/reset/len]
    slowlog-log-slower-than 它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令进行记录
    slowlog-max-len 它决定 slowlog 最多能保存多少条日志

    24.redis工具

    redis-cli
    info/monitor(调试命令)
    Redisclient
    http://www.oschina.net/news/53391/redisclient-1-0
    http://www.oschina.net/news/55634/redisclient-2-0

    redis info命令

    详细参考
    http://redis.readthedocs.org/en/latest/server/info.html

    25.redis主从复制(1)

    redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
    修改配置文件redis.conf,只修改从数据库
    slaveof ip port
    slaveof no one 可以把从数据库转为主数据库
    通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
    主从复制过程:见备注

    注意:从 Redis 2.8 开始, 为了保证数据的安全性, 可以通过配置min-slaves-to-write, 让一个主节点在至少有N个从节点的情况下才能执行写操作。从节点以每秒一次的频率ping主节点,主节点会记录各个从服务器最后一次向它发送ping的时间。用户可以通过配置, 指定网络延迟的最大值 min-slaves-max-lag以及执行写操作所需的至少从服务器数量 min-slaves-to-write
    min-slaves-to-write 3
    min-slaves-max-lag 10
    如果至少有 min-slaves-to-write 个从服务器, 并且这些服务器的延迟值都少于 min-slaves-max-lag 秒, 那么主服务器才会执行客户端请求的写操作。只要有一个条件不满足,写操作就不会执行,主服务器会向请求执行写操作的客户端返回一个错误

    26.redis的Sentinel

    redis的sentinel系统用于管理多个redis服务器,该系统主要执行三个任务
    1:监控
    2:提醒
    3:自动故障转移
    画图分析sentinel
    配置sentinel
    修改sentinel.conf文件
    sentinel monitor mymaster 192.168.1.170 6379 2
    启动sentinel的两种方式
    redis-sentinel sentinel.conf
    redis-server sentinel.conf --sentinel
    sentinel日志明细说明
    http://redisdoc.com/topic/sentinel.html
    主观下线和客观下线
    通过订阅指定的频道信息,当服务器出现故障得时候通知管理员
    客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
    一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

    27.java操作sentinel

    image

    28.sentinel的一些命令

    INFO
    sentinel的基本状态信息
    SENTINEL masters
    列出所有被监视的主服务器,以及这些主服务器的当前状态
    SENTINEL slaves <master name>
    列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
    SENTINEL get-master-addr-by-name <master name>
    返回给定名字的主服务器的 IP 地址和端口号
    SENTINEL reset <pattern>
    重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
    SENTINEL failover <master name>
    当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

    29.java操作redis集群

    Set<HostAndPort> nodes = new HashSet<HostAndPort>();

    HostAndPort hostAndPort = new HostAndPort("192.168.1.160", 7000);

    HostAndPort hostAndPort1 = new HostAndPort("192.168.1.160", 7001);

    HostAndPort hostAndPort2 = new HostAndPort("192.168.1.160", 7002);

    HostAndPort hostAndPort3 = new HostAndPort("192.168.1.160", 7003);

    HostAndPort hostAndPort4 = new HostAndPort("192.168.1.160", 7004);

    HostAndPort hostAndPort5 = new HostAndPort("192.168.1.160", 7005);

    nodes.add(hostAndPort);

    nodes.add(hostAndPort1);

    nodes.add(hostAndPort2);

    nodes.add(hostAndPort3);

    nodes.add(hostAndPort4);

    nodes.add(hostAndPort5);

    JedisPoolConfig poolConfig = new JedisPoolConfig();

    JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig );

    String string = jedisCluster.get("aa");

    System.err.println(string);

  • 相关阅读:
    《BI项目笔记》挑选产出分析Cube
    《BI项目笔记》报到信息分析Cube
    详解jQuery each() 方法
    可编辑的select下拉框
    可编辑的select下拉框
    UML关系(泛化,实现,依赖,关联(聚合,组合))
    UML关系(泛化,实现,依赖,关联(聚合,组合))
    深入浅出UML图(三)
    深入浅出UML图(三)
    深入浅出UML类图(二)
  • 原文地址:https://www.cnblogs.com/chaoren399/p/4817196.html
Copyright © 2011-2022 走看看