1.Redis安装
Redis 是一个开源(BSD许可)的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
- 以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: #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。
hiredis下载安装
#make #sudo make install
常用的接口函数
(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
经过编译后,运行结果如下:
- 总结:通过对Redis环境搭建和数据类型的了解,加上练习redis命令,加深了对redis的理解和使用,希望对今后工作有帮助。若有不足的,希望各位大神不吝指出,我会及时总结更正,谢谢。