The Little Redis Book
https://www.openmymind.net/redis.pdf
1、redis服务端
1)redis编译
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar xvf redis-4.0.11.tar.gz
cd redis-4.0.11
#make MALLOC=libc
make MALLOC=Jemalloc
make install PREFIX=/usr/local/redis
sudo mkdir -p /usr/local/redis/etc
sudo cp redis.conf /usr/local/redis/etc
vi /etc/profile
export PATH=$PATH:/usr/local/redis/bin
source /etc/profile
更改redis.conf文件中的daemonize和stop-writes-on-bgsave-error
daemonize yes
stop-writes-on-bgsave-error no
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
查看redis服务是否启动
ps -ef | grep -i redis
2)redis交叉编译
tar xvf redis-4.0.11.tar.gz
cd redis-4.0.11
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export LD=arm-linux-gnueabihf-ld
export RAINLIB=arm-linux-gnueabihf-rainlib
export AR=arm-linux-gnueabihf-ar
export LINK=arm-linux-gnueabihf-g++
#make MALLOC=libc
make MALLOC=Jemalloc
make install PREFIX=_install
mkdir _install/etc
sudo cp redis.conf _install/etc
vi /etc/profile
export PATH=$PATH:/usr/local/xxx/bin
source /etc/profile
./redis-server /usr/local/xxx/redis/etc/redis.conf
3)简单的使用
//首先链接客户端
[root@localhost redis]# redis-cli
//检查网络是否可以
127.0.0.1:6379> ping PONG
//设置一个键值对
127.0.0.1:6379> set name cheny
OK
//获取刚刚设置的键值对
127.0.0.1:6379> get name
"cheny"
//查看所有的键
127.0.0.1:6379> keys *
1) "name"
//删除name这个键
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
更多指令
https://redis.io/commands/dump
4) Clients
2、python client
sudo apt-get install python-pip
sudo pip install virtualenv
virtualenv -p /usr/bin/python env
source env/bin/activate
pip install redis
test.py
import redis client = redis.StrictRedis(host='127.0.0.1', port=6379) key = "hello" client.set(key, "python-redis") value = client.get(key) print "key:" + key + ", value:" + value
test1.py(watch竞争机制)
import redis from redis import WatchError r = redis.StrictRedis(host='127.0.0.1', port=6379) def redis_set_key(key, data): with r.pipeline() as pipe: while 1: try: # put a WATCH on the key that holds our sequence value pipe.watch(key) # after WATCHing, the pipeline is put into immediate execution # mode until we tell it to start buffering commands again. # this allows us to get the current value of our sequence current_value = pipe.get(key) #next_value = int(current_value, base=10) + 1 #next_value = float(current_value) + 1 #next_value = unicode(int(current_value) + 1) next_value = data # now we can put the pipeline back into buffered mode with MULTI pipe.multi() pipe.set(key, next_value) current_value = pipe.get(key) # and finally, execute the pipeline (the set command) pipe.execute() # if a WatchError wasn't raised during execution, everything # we just did happened atomically. break except WatchError: # another client must have changed 'OUR-SEQUENCE-KEY' between # the time we started WATCHing it and the pipeline's execution. # our best bet is to just retry. continue return current_value redis_set_key('battery',9.99) redis_set_key('4g',333)
3、nodejs client
npm install redis --save
test.js
const redis = require('redis') const client = redis.createClient(6379, 'localhost') client.set('hello', 'node-redis') client.get('hello', function(err, value){ console.log(value) })
test.js(watch竞争机制)
const redis = require('redis') const client = redis.createClient(6379, 'localhost') client.watch("battery") client.get('battery', function(err, value){ console.log(value) }) client.get('4g', function(err, value){ console.log(value) }) var multi = client.multi() multi.set("battery",6.66) multi.set("battery",777) multi.exec(function(err,replies){ console.log(replies) }) client.get('battery', function(err, value){ console.log(value) }) client.get('4g', function(err, value){ console.log(value) }) client.quit();
4、redis c语言客户端
https://redislabs.com/lp/hiredis/
1)hiredis编译
make
make install PREFIX=_install
sudo tar xvf _install.tar.gz
cd /usr/local/
sudo tar xvf _install.tar.gz
sudo mv _install hiredis
export LD_LIBRARY_PATH=/usr/local/hiredis/lib:$LD_LIBRARY_PATH
example
https://github.com/redis/hiredis/tree/master/examples
example.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
const char *hostname = "127.0.0.1";
const int port = 6379;
redisContext *c;
redisReply *reply;
int redis_connect(void)
{
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
c = redisConnectWithTimeout(hostname, port, timeout);
if (c == NULL || c->err) {
if (c) {
printf("Connection error: %s
", c->errstr);
redisFree(c);
} else {
printf("Connection error: can't allocate redis context
");
}
return -1;
}
/* PING server */
reply = redisCommand(c,"PING");
printf("PING: %s
", reply->str);
freeReplyObject(reply);
return 0;
}
int main() {
if(redis_connect() != 0)
return -1;
/* Set a key */
float battery_value = 5.55;
reply = redisCommand(c,"SET %s %f", "battery",battery_value);
printf("SET: %s
", reply->str);
freeReplyObject(reply);
/* Set a key */
int net_signal_value = 666;
reply = redisCommand(c,"SET %s %d", "4g",net_signal_value);
printf("SET: %s
", reply->str);
freeReplyObject(reply);
/* Try a GET */
reply = redisCommand(c,"GET battery");
printf("GET battery: %s
", reply->str);
freeReplyObject(reply);
/* Try a GET */
reply = redisCommand(c,"GET 4g");
printf("GET 4g: %s
", reply->str);
freeReplyObject(reply);
/* Disconnects and frees the context */
redisFree(c);
return 0;
}
example.c(watch竞争机制)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
const char *hostname = "127.0.0.1";
const int port = 6379;
redisContext *c;
redisReply *reply;
int redis_connect(void)
{
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
c = redisConnectWithTimeout(hostname, port, timeout);
if (c == NULL || c->err) {
if (c) {
printf("Connection error: %s
", c->errstr);
redisFree(c);
} else {
printf("Connection error: can't allocate redis context
");
}
return -1;
}
/* PING server */
reply = redisCommand(c,"PING");
printf("PING: %s
", reply->str);
freeReplyObject(reply);
return 0;
}
int main() {
if(redis_connect() != 0)
return -1;
reply = redisCommand(c, "watch battery");
printf("watch battery: %s
", reply->str);
freeReplyObject(reply);
reply = redisCommand(c, "multi");
printf("multi: %s
", reply->str);
freeReplyObject(reply);
float battery_value = 2.222;
reply = redisCommand(c,"SET %s %f", "battery",battery_value);
printf("SET: %s
", reply->str);
freeReplyObject(reply);
int net_signal_value = 888;
reply = redisCommand(c,"SET %s %d", "4g",net_signal_value);
printf("SET: %s
", reply->str);
freeReplyObject(reply);
reply = redisCommand(c, "exec");
printf("exec: %s
", reply->str);
freeReplyObject(reply);
reply = redisCommand(c,"GET battery");
printf("GET battery: %s
", reply->str);
freeReplyObject(reply);
reply = redisCommand(c,"GET 4g");
printf("GET 4g: %s
", reply->str);
freeReplyObject(reply);
redisFree(c);
return 0;
}
gcc -o example example.c -I ./_install/include/hiredis -L ./_install/lib -lhiredis
./example
export LD_LIBRARY_PATH=${pwd}/_install/lib:$LD_LIBRARY_PATH
gcc -o example example.c -I ./_install/include/hiredis ./_install/lib/libhiredis.a
2)hiredis交叉编译
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export LD=arm-linux-gnueabihf-ld
export RAINLIB=arm-linux-gnueabihf-rainlib
export AR=arm-linux-gnueabihf-ar
export LINK=arm-linux-gnueabihf-g++
make
make install PREFIX=_install
arm-linux-gnueabihf-gcc -o example example.c -I ./_install/include/hiredis -L ./_install/lib -lhiredis
export LD_LIBRARY_PATH=/usr/local/hiredis/lib:$LD_LIBRARY_PATH
./example
## rdb config
https://blog.csdn.net/codeliang20/article/details/107869852
https://blog.csdn.net/li1325169021/article/details/99243921
5、redis竞争
https://blog.csdn.net/happy_wu/article/details/78736641
网友的总结