redis快速上手手册

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis快速上手手册相关的知识,希望对你有一定的参考价值。

这两天走到redis模块的应用了,转身突然发现,写了那么些篇redis的原理,居然在基础使用上栽了跟头。
(集群?简单。主从?easy。插值?emmm,容我三思、、、)
本来想着明天把这篇写了,但是想想明天又是东奔西跑的一天,就这还要抽时间出来推进开发进度,还是今晚加个班吧。

全都列在这儿,省的到处去找别人的。


环境配置

环境配置之前有写过了,所以直接上链接就好。
Redis环境搭建与配置
hiredis从安装到实操,一条龙服务

问题不大。


废话我就不多说了,这里很重要的一点:
如果你的SQL思想包袱过重,一定要先放空大脑,从SQL到NoSQL的转变不难,但也不是一句“我要转变”就转过去的了。前期可以借助JSON,我就是这么干的。


中文乱码问题解决

如果是直接用客户端操作的话:
./redis-cli --raw

如果是用代码操作的话(我觉得批量操作应该要用代码吧):
JSON.dump()


远程连接信任问题

这个报错的时候会提供好几个解决方案,还是比较人性化的。


redis键的基本操作

基本语法:redis 127.0.0.1:6379> COMMAND KEY_NAME

命令描述
DEL key该命令用于在 key 存在时删除 key。
DUMP key序列化给定 key ,并返回被序列化的值。
EXISTS key检查给定 key 是否存在。
EXPIRE key seconds为给定 key 设置过期时间,以秒计。
EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
PEXPIRE key milliseconds设置 key 的过期时间以毫秒计。
PEXPIREAT key milliseconds-timestamp设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
KEYS pattern查找所有符合给定模式( pattern)的 key 。
MOVE key db将当前数据库的 key 移动到给定的数据库 db 当中。
PERSIST key移除 key 的过期时间,key 将持久保持。
PTTL key以毫秒为单位返回 key 的剩余的过期时间。
TTL key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
RANDOMKEY从当前数据库中随机返回一个 key 。
RENAME key newkey修改 key 的名称
RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey 。
SCAN cursor [MATCH pattern] [COUNT count]迭代数据库中的数据库键。
TYPE key返回 key 所储存的值的类型。

字符串命令

命令描述
SET key value设置指定 key 的值
GET key获取指定 key 的值。
GETRANGE key start end返回 key 中字符串值的子字符
GETSET key value将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
GETBIT key offset对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
MGET key1 [key2…]获取所有(一个或多个)给定 key 的值。
SETBIT key offset value对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
SETEX key seconds value将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
SETNX key value只有在 key 不存在时设置 key 的值。
SETRANGE key offset value用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
STRLEN key返回 key 所储存的字符串值的长度。
MSET key value [key value …]同时设置一个或多个 key-value 对。
MSETNX key value [key value …]同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
PSETEX key milliseconds value这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
INCR key将 key 中储存的数字值增一。
INCRBY key increment将 key 所储存的值加上给定的增量值(increment) 。
INCRBYFLOAT key increment将 key 所储存的值加上给定的浮点增量值(increment) 。
DECR key将 key 中储存的数字值减一。
DECRBY key decrementkey 所储存的值减去给定的减量值(decrement) 。
APPEND key value如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

哈希命令

命令描述
HDEL key field1 [field2]删除一个或多个哈希表字段
HEXISTS key field查看哈希表 key 中,指定的字段是否存在。
HGET key field获取存储在哈希表中指定字段的值。
HGETALL key获取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment为哈希表 key 中的指定字段的整数值加上增量 increment 。
HINCRBYFLOAT key field increment为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
HKEYS key获取所有哈希表中的字段
HLEN key获取哈希表中字段的数量
HMGET key field1 [field2]获取所有给定字段的值
HMSET key field1 value1 [field2 value2 ]同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSET key field value将哈希表 key 中的字段 field 的值设为 value 。
HSETNX key field value只有在字段 field 不存在时,设置哈希表字段的值。
HVALS key获取哈希表中所有值。
HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的键值对。

列表

命令描述
BLPOP key1 [key2 ] timeout移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key1 [key2 ] timeout移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOPLPUSH source destination timeout从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
LINDEX key index通过索引获取列表中的元素
LINSERT key BEFOREAFTER pivot value
LLEN key获取列表长度
LPOP key移出并获取列表的第一个元素
LPUSH key value1 [value2]将一个或多个值插入到列表头部
LPUSHX key value将一个值插入到已存在的列表头部
LRANGE key start stop获取列表指定范围内的元素
LREM key count value移除列表元素
LSET key index value通过索引设置列表元素的值
LTRIM key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
RPOP key移除列表的最后一个元素,返回值为移除的元素。
RPOPLPUSH source destination移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPUSH key value1 [value2]在列表中添加一个或多个值
RPUSHX key value为已存在的列表添加值

集合

命令描述
SADD key member1 [member2]向集合添加一个或多个成员
SCARD key获取集合的成员数
SDIFF key1 [key2]返回第一个集合与其他集合之间的差异。
SDIFFSTORE destination key1 [key2]返回给定所有集合的差集并存储在 destination 中
SINTER key1 [key2]返回给定所有集合的交集
SINTERSTORE destination key1 [key2]返回给定所有集合的交集并存储在 destination 中
SISMEMBER key member判断 member 元素是否是集合 key 的成员
SMEMBERS key返回集合中的所有成员
SMOVE source destination member将 member 元素从 source 集合移动到 destination 集合
SPOP key移除并返回集合中的一个随机元素
SRANDMEMBER key [count]返回集合中一个或多个随机数
SREM key member1 [member2]移除集合中一个或多个成员
SUNION key1 [key2]返回所有给定集合的并集
SUNIONSTORE destination key1 [key2]所有给定集合的并集存储在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count]迭代集合中的元素

连接命令

命令描述
ECHO message打印字符串
PING查看服务是否运行
QUIT关闭当前连接
SELECT index切换到指定的数据库

使用案例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
#include <win32.h>

int main(int argc, char **argv) 
    unsigned int j, isunix = 0;
    redisContext *c;
    redisReply *reply;
    const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";

    if (argc > 2) 
        if (*argv[2] == 'u' || *argv[2] == 'U') 
            isunix = 1;
            /* in this case, host is the path to the unix socket */
            printf("Will connect to unix socket @%s\\n", hostname);
        
    

    int port = (argc > 2) ? atoi(argv[2]) : 6379;

    struct timeval timeout =  1, 500000 ; // 1.5 seconds
    if (isunix) 
        c = redisConnectUnixWithTimeout(hostname, timeout);
     else 
        c = redisConnectWithTimeout(hostname, port, timeout);
    
    if (c == NULL || c->err) 
        if (c) 
            printf("Connection error: %s\\n", c->errstr);
            redisFree(c);
         else 
            printf("Connection error: can't allocate redis context\\n");
        
        exit(1);
    

    /* PING server */
    reply = redisCommand(c,"PING");
    printf("PING: %s\\n", reply->str);
    freeReplyObject(reply);

    /* Set a key */
    reply = redisCommand(c,"SET %s %s", "foo", "hello world");
    printf("SET: %s\\n", reply->str);
    freeReplyObject(reply);

    /* Set a key using binary safe API */
    reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
    printf("SET (binary API): %s\\n", reply->str);
    freeReplyObject(reply);

    /* Try a GET and two INCR */
    reply = redisCommand(c,"GET foo");
    printf("GET foo: %s\\n", reply->str);
    freeReplyObject(reply);

    reply = redisCommand(c,"INCR counter");
    printf("INCR counter: %lld\\n", reply->integer);
    freeReplyObject(reply);
    /* again ... */
    reply = redisCommand(c,"INCR counter");
    printf("INCR counter: %lld\\n", reply->integer);
    freeReplyObject(reply);

    /* Create a list of numbers, from 0 to 9 */
    reply = redisCommand(c,"DEL mylist");
    freeReplyObject(reply);
    for (j = 0; j < 10; j++) 
        char buf[64];

        snprintf(buf,64,"%u",j);
        reply = redisCommand(c,"LPUSH mylist element-%s", buf);
        freeReplyObject(reply);
    

    /* Let's check what we have inside the list */
    reply = redisCommand(c,"LRANGE mylist 0 -1");
    if (reply->type == REDIS_REPLY_ARRAY) 
        for (j = 0; j < reply->elements; j++) 
            printf("%u) %s\\n", j, reply->element[j]->str);
        
    
    freeReplyObject(reply);

    /* Disconnects and frees the context */
    redisFree(c);

    return 0;


关于 redisCommand 以及 redisReply

目前手上资料不多,先拿这些出来:

void* redisCommand(redisContext c,const char format,...); 

返回值是一个void类型的指针,实际为指向一个redisReply类型的指针

redisReply结构体定义如下:

/* This is the reply object returned by redisCommand() */
typedef struct redisReply 
    int type; /* REDIS_REPLY_* */
    long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
    size_t len; /* Length of string */
    char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
    size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
    struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
 redisReply;

下面是几种redis的常见错误及返回值类型:

#define REDIS_ERR -1
#define REDIS_OK 0
#define REDIS_ERR_IO 1 /* Error in read or write */
#define REDIS_ERR_EOF 3 /* End of file */
#define REDIS_ERR_PROTOCOL 4 /* Protocol error */
#define REDIS_ERR_OOM 5 /* Out of memory */
#define REDIS_ERR_OTHER 2 /* Everything else... */     
#define REDIS_REPLY_STRING 1   //返回字符串,查看str,len字段
#define REDIS_REPLY_ARRAY 2    //返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针
#define REDIS_REPLY_INTEGER 3  //返回整数,从integer字段获取值
#define REDIS_REPLY_NIL 4      //没有数据返回
#define REDIS_REPLY_STATUS 5   //表示状态,内容通过str字段查看,字符串长度是len字段
#define REDIS_REPLY_ERROR 6    //表示出错,查看出错信息,如上的str字段

以上是关于redis快速上手手册的主要内容,如果未能解决你的问题,请参考以下文章

Kafka3.x核心知识速查手册-一快速上手篇

小目标 | Power BI新人快速上手手册

小目标 | Power BI新人快速上手手册

小目标 | Power BI新人快速上手手册

快速上手React:

#yyds干货盘点#--快速上手redis-sentinel(哨兵)