Redis学习与使用(1)

1.Redis安装

Redis 是一个开源(BSD许可)的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。

  1. 以linux/ubuntu为例,Redis安装步骤如下:

     1. 官网下载源码包:
             官网下载源码:http://www.redis.cn
     2. 解压并安装
             #wget http://download.redis.io/redis-stable.tar.gz 
             #tar -zxvf redis-stable.tar.gz cd redis-stable
             #make 
             #make install 
             #make test
       若提示关于tcl8.6.1-src.tar.gz错误的信息,则处理办法如下:
            #wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz 
            #tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/ cd /usr/local/tcl8.6.1/unix/ 
            #./configure 
            #make 
            #make install
     3. 在ubuntu系统上,能使用命令安装:
            #sudo apt-get update
            #sudo apt-get install redis-server

     4. 若安装成功,则启动Redis服务:        
            #redis-server &

启动

    #redis-cli

redis-cli
这里写图片描述

  检查是否启动redis: #ps -ef | grep -i redis
  关闭Redis服务:    #redis-cli shutdown

2.Redis使用

Redis常见的数据类型有字符串、散列、列表、集合、有序集合等类型。      

2.1. 字符串类型(strings)

  • 字符串类型是Redis最基本的数据类型,常用来存储二进制数据,Json化对象。一个字符串类型的键允许存储数据的最大容量是512M。

 1. 将键为key的值设置为value的键值对
        #set key value
 2. 获取键为key的值
        #get key
 3. 判断键是否存在,存在返回1,不存在返回0
        #exists key
 4. 删除键(可以删除一个或多个)
        #del key [key ...]
 5. 获取键值得数据类型
        #type key   
 6. 增加或减少指定key对应的value整数值
        #incrby key increment
        #decrby key increment
 7. 增加指定key对应的value浮点值
        #incrbyfloat key incremnet
 8. 查找所有符合给定模式的pattern的key.
        #keys pattern
 9. 尾部追加键key对应的value值
        #append key value
 10. 设置多个键值或获取多个键值
        #mset key value [key value ...]
        #mget key [key ...]
注意:     
    ?:匹配一个字符
    *:匹配任一个(包含0个)字符
    []:匹配括号间任一符号,可以使用“-"符号表示一个范围
    \x:匹配字符x,用于转义字符

2.2. 散列类型(hash)

  • 散列类型常用来存储使用对象类别和ID构成键名,使用字段表示对象的属性,二字段值则是存储属性值。

 1. 设置key指定的哈希集中指定字段的值
        #hset key field value
 2. 获取指定的哈希集中该字段所关联的值
        #hget key
 3. 设置key指定的哈希集中指定字段的值和获取key指定的哈希集中指定字段的值
        #hmset key field value [field value ...]
        #hmget key field [field ...]
 4. 获取key指定的哈希集中所有的字段和值
        #hgetall key
 5. 判断field字段是否存在
        #hexists key field
 6. 当field字段不存在时赋值
        #hsetnx key field value
 7. 增加key指定的哈希集中指定字段的数值
        #hincrby key field incremnet
 8. 从key指定的哈希集中移除或删除field字段
        #hdel key field [field ...]
 9. 获取key指定的哈希集中所有的字段名或字段值
        #hkeys key
        #hvals key
 10. 获取key指定的哈希集包含的字段的数量
        #hlen key   

2.3. 列表类型(list)

  • 列表类型用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或获得列表的某一片段。

 1. 将所有指定的值插入到存在于key列表的头部
          #lpush key value [value ...]  
 2. 向存于key的列表的尾部插入所有指定的值
          #rpush key value [value ...]
 3. 移除并返回对应的list的第一个元素
         #lpop key 
 4. 移除并返回对应的list的最后一个元素
          #rpop key
 5. 返回存储在key里的list的长度
         #llen key
 6. 返回存储在key列表里指定范围内的元素,返回索引从start到stop之间的所有元素(包括两端的元素)
         #lrange key start stop
 7. 从存于key列表中欧冠移除前count次出现的值为value,最终,返回值是实际删除的元素个数。
         #lrem key count value  
    注意:
        (1)当count>0,即从头到尾移除值为value的元素;
        (2)当count<0,即从尾往头移除值为value的元素;
        (3)当count==0,即移除所有值为value的元素。                        
 8. 获取列表指定索引的元素值
         #lindex key index
 9. 设置列表指定索引的元素值
         #lset key index value
 10. 只保留或修剪列表指定范围的指定元素
         #ltrim key start stop
 11. 把value插入存于列表中在基准值pivot的前面或后面
         #linsert key before|after pivot value
 12. 原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 
并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。
         #rpoplpush source destination  

2.4. 集合类型(set)

  • 集合是字符串类型的无序集合,集合的成员是唯一的,不能有重复元素,集合中最多为2的32次方减1个,并且元素间没有顺序。

     1. 添加一个或多个指定member元素到集合的key中。
            #sadd key member [member ...]
     2. 在key集合中移除指定的元素。
            #srem key member [member ...]
     3. 移除并返回集合中的一个随机元素
            #spop key
     4. 获取key集合所有元素
            #smembers key
     5. 判断元素是否在集合中
            #sismember eky member
     6. 集合间运算:交集、并集、差集
            #sinter key [key ...]
            #sunion key [key ...]
            #sdiff key [key ...]
     7. 返回集合存储的key的基数(集合元素的数量)
            #scard key
     8. 进行集合运算并将结果存储在destination键中
            #sdiffstore destination key [key ...]
            #sinterstore destination key [key ...]
            #sunionstore destination key [key ...]
     9. 随机获得集合中的元素
            #srandmember key [count]
        注意:
             (1)当count > 0 时,随机从集合中获得count个不重复的元素;
             (2)若count的值大于集合中的元素个数,则返回全部元素;
             (3)当count < 0 时,随机从集合中获得count个可能重复的元素 。

2.5. 有序集合类型(zset)

  • 有序集合是在集合基础上为每个元素关联一个分数,支持插入、删除等操作,但比列表更费内存。

     1. 将所有指定成员添加到键为key有序集合。
            #zadd key score member [score member ...]
     2. 返回有序集key中,成员member的score值。
             #zscore key member
     3. 获得排名在某个范围的元素列表。
             #zrange key start stop [withscores]
             #zrevrange key start stop [withscores]
     4. 获得指定分数范围的元素
             #zrangebyscore key min max [withscores] [limit offset count]
             注意:a.min 和 max支持无穷大(-inf +inf)
     5. 增加或减少某个元素的分数,返回值时更改后的分数
             #zincrby key incremnet member
     6. 获取有序集合中元素的数量
             #zcard key
     7. 获得指定分数在min和max范围内的元素总数
             #zcount key min max
     8. 移除分数在min和max范围的元素,返回删除元素数量
             #zremrangebyscore key min max
     9. 获得元素的升顺或降顺
             #zrank key member
             #zrevrank key member
     10. 计算有序集合的交集,destinade键中元素的分数是由AGGREGATE参数决定的。            
             #ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]    
        注意:
        (1)当AGGREGATE时SUM(即默认值),destination键中元素的分数是每个参与计算的集合中该元素分数和;
        (2)当AGGREGATE时MIN,destination键中元素的分数是每个参与计算的集合中最小的元素分数;
        (3)当AGGREGATE时MAX,destination键中元素的分数是每个参与计算的集合中最大的元素分数。     

3.C++简单使用Redis

  • hiredis是redis数据库的C接口,下载地址:https://github.com/redis/hiredis

    1. hiredis下载安装

       #make
       #sudo make install
      
    2. 常用的接口函数

       (1)函数原型:redisContext *redisConnect(const char *ip, int port)
       说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379;
       返回值:redisContext *。
       (2)函数原型:void *redisCommand(redisContext *c, const char *format, ...);
       说明:该函数执行命令,执行redis数据库中的操作命令,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参;
       返回值:void*,一般强制转换成为redisReply类型的进行进一步的处理。
       (3)函数原型void freeReplyObject(void *reply);
       说明:释放redisCommand执行后返回的redisReply所占用的内存;
       (4)函数原型:void redisFree(redisContext *c);
       说明:释放redisConnect()所产生的连接。
      
  • C/C++简单操作Redis

//redis.h
#ifndef _REDIS_H_
#define _REDIS_H_

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <hiredis/hiredis.h>

using namespace std;

class Redis
{
    public:
      Redis(){};
      ~Redis()
      {
            m_connect = NULL;
            m_reply = NULL;
      }
      bool connect(string host,int port)
      {
        this->m_connect = redisConnect(host.c_str(),port);
        if(this->m_connect != NULL && this->m_connect->err)
        {
            cout<<"connect error:"<<this->m_connect->errstr<<endl;
            return 0;
        }
        return 1;
      }
      string hget(string key, string field)
      {
        this->m_reply = (redisReply *)redisCommand(this->m_connect, "HGET %s %s", key.c_str(), field.c_str());
        string str = this->m_reply->str;
        freeReplyObject(this->m_reply);
        return str;
      }
      void hset(string key, string field, string value)
      {
            redisCommand(this->m_connect, "HSET %s %s %s", key.c_str(), field.c_str(), value.c_str());
      }
    private:
      redisContext *m_connect;
      redisReply *m_reply;
};
#endif//_REDIS_H_
//redis.cpp
#include "redis.h"
int main(void)
{
    Redis *r = new Redis();
    if(!r->connect("127.0.0.1",6379))
    {
        cout<<"connect error"<<endl;
        return 0;
    }
    r->hset("myhash", "field1", "foo");
    cout<<"the value is "<<r->hget("myhash", "field1").c_str()<<endl;
    delete r;
    return 0;
}
#makefile
redis:redis.cpp redis.h
    g++ redis.cpp redis.h -o redis -L/usr/include/lib -lhiredis
clean:
    rm -rf redis.o && rm -rf redis
经过编译后,运行结果如下:

1
2

  • 总结:通过对Redis环境搭建和数据类型的了解,加上练习redis命令,加深了对redis的理解和使用,希望对今后工作有帮助。若有不足的,希望各位大神不吝指出,我会及时总结更正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值