redis安装
下载地址:https://redis.io/download,
本人下载版本:redis-5.0.5
将软件解压到安装目录,本人mac安装目录为:~/software。
解压完成后,redis需要通过make进行编译,并使用make install进行安装
tar -zxvf redis-5.0.5.tar.gz -C ~/software
cd ~/software/redis-5.0.5
make
make install
执行结果如下:
➜ redis-5.0.5 make
cd src && /Library/Developer/CommandLineTools/usr/bin/make all
CC Makefile.dep
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark
(cd ../deps && /Library/Developer/CommandLineTools/usr/bin/make distclean)
(cd hiredis && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd linenoise && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd lua && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd jemalloc && [ -f Makefile ] && /Library/Developer/CommandLineTools/usr/bin/make distclean) > /dev/null || true
(rm -f .make-*)
(rm -f .make-*)
echo STD=-std=c99 -pedantic -DREDIS_STATIC='' >> .make-settings
echo WARN=-Wall -W -Wno-missing-field-initializers >> .make-settings
echo OPT=-O2 >> .make-settings
echo MALLOC=libc >> .make-settings
echo CFLAGS= >> .make-settings
echo LDFLAGS= >> .make-settings
echo REDIS_CFLAGS= >> .make-settings
echo REDIS_LDFLAGS= >> .make-settings
echo PREV_FINAL_CFLAGS=-std=c99 -pedantic -DREDIS_STATIC='' -Wall -W -Wno-missing-field-initializers -O2 -g -ggdb -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src >> .make-settings
echo PREV_FINAL_LDFLAGS= -g -ggdb >> .make-settings
(cd ../deps && /Library/Developer/CommandLineTools/usr/bin/make hiredis linenoise lua)
(cd hiredis && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd linenoise && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd lua && /Library/Developer/CommandLineTools/usr/bin/make clean) > /dev/null || true
(cd jemalloc && [ -f Makefile ] && /Library/Developer/CommandLineTools/usr/bin/make distclean) > /dev/null || true
(rm -f .make-*)
(echo "" > .make-ldflags)
(echo "" > .make-cflags)
MAKE hiredis
cd hiredis && /Library/Developer/CommandLineTools/usr/bin/make static
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb net.c
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb hiredis.c
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb sds.c
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb async.c
cc -std=c99 -pedantic -c -O3 -fPIC -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb read.c
ar rcs libhiredis.a net.o hiredis.o sds.o async.o read.o
MAKE linenoise
cd linenoise && /Library/Developer/CommandLineTools/usr/bin/make
cc -Wall -Os -g -c linenoise.c
MAKE lua
cd lua/src && /Library/Developer/CommandLineTools/usr/bin/make all CFLAGS="-O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' " MYLDFLAGS="" AR="ar rcu"
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lapi.o lapi.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lcode.o lcode.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ldebug.o ldebug.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ldo.o ldo.c
ldo.c:496:7: warning: unused variable 'c' [-Wunused-variable]
int c = luaZ_lookahead(p->z);
^
1 warning generated.
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ldump.o ldump.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lfunc.o lfunc.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lgc.o lgc.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o llex.o llex.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lmem.o lmem.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lobject.o lobject.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lopcodes.o lopcodes.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lparser.o lparser.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lstate.o lstate.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lstring.o lstring.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ltable.o ltable.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ltm.o ltm.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lundump.o lundump.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lvm.o lvm.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lzio.o lzio.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o strbuf.o strbuf.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o fpconv.o fpconv.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lauxlib.o lauxlib.c
lauxlib.c:577:61: warning: while loop has empty body [-Wempty-body]
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
^
lauxlib.c:577:61: note: put the semicolon on a separate line to silence this
warning
1 warning generated.
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lbaselib.o lbaselib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ldblib.o ldblib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o liolib.o liolib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lmathlib.o lmathlib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o loslib.o loslib.c
loslib.c:60:3: warning: 'tmpnam' is deprecated: This function is provided for
compatibility reasons only. Due to security concerns inherent in the
design of tmpnam(3), it is highly recommended that you use mkstemp(3)
instead. [-Wdeprecated-declarations]
lua_tmpnam(buff, err);
^
./luaconf.h:657:33: note: expanded from macro 'lua_tmpnam'
#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); }
^
/usr/include/stdio.h:277:7: note: 'tmpnam' has been explicitly marked
deprecated here
char *tmpnam(char *);
^
1 warning generated.
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o ltablib.o ltablib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lstrlib.o lstrlib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o loadlib.o loadlib.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o linit.o linit.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lua_cjson.o lua_cjson.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lua_struct.o lua_struct.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lua_cmsgpack.o lua_cmsgpack.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lua_bit.o lua_bit.c
ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o strbuf.o fpconv.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o lua_cjson.o lua_struct.o lua_cmsgpack.o lua_bit.o # DLL needs all object files
ranlib liblua.a
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o lua.o lua.c
cc -o lua lua.o liblua.a -lm
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o luac.o luac.c
cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -c -o print.o print.c
cc -o luac luac.o print.o liblua.a -lm
CC adlist.o
CC quicklist.o
CC ae.o
CC anet.o
CC dict.o
CC server.o
CC sds.o
CC zmalloc.o
CC lzf_c.o
CC lzf_d.o
CC pqsort.o
CC zipmap.o
CC sha1.o
CC ziplist.o
CC release.o
CC networking.o
CC util.o
CC object.o
CC db.o
CC replication.o
CC rdb.o
CC t_string.o
CC t_list.o
CC t_set.o
CC t_zset.o
CC t_hash.o
CC config.o
CC aof.o
CC pubsub.o
CC multi.o
CC debug.o
CC sort.o
CC intset.o
CC syncio.o
CC cluster.o
CC crc16.o
CC endianconv.o
CC slowlog.o
CC scripting.o
CC bio.o
CC rio.o
CC rand.o
CC memtest.o
CC crc64.o
CC bitops.o
CC sentinel.o
CC notify.o
CC setproctitle.o
CC blocked.o
CC hyperloglog.o
CC latency.o
CC sparkline.o
CC redis-check-rdb.o
CC redis-check-aof.o
CC geo.o
CC lazyfree.o
CC module.o
CC evict.o
CC expire.o
CC geohash.o
CC geohash_helper.o
CC childinfo.o
CC defrag.o
CC siphash.o
CC rax.o
CC t_stream.o
CC listpack.o
CC localtime.o
CC lolwut.o
CC lolwut5.o
LINK redis-server
INSTALL redis-sentinel
CC redis-cli.o
LINK redis-cli
CC redis-benchmark.o
LINK redis-benchmark
INSTALL redis-check-rdb
INSTALL redis-check-aofHint: It's a good idea to run 'make test' ;)
➜ redis-5.0.5 make install
cd src && /Library/Developer/CommandLineTools/usr/bin/make install
CC Makefile.depHint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
对redis进行配置
vim redis.conf
- redis可以配置访问的密码,为了测试学习方便,我们对配置文件中的
protected-mode yes修改为
protected-mode no
- redis默认配置绑定IP地址为 bind 127.0.0.1,这样的配置只能本地进行访问,同样为了测试学习方便,我们将该配置改为
bind 0.0.0.0
- redis 默认不能在后台运行,默认配置 daemonize no,我们需要将该配置改为daemonize yes。配置文件中的注释如下:
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
- redis的日志默认为空,日志输出配置为:logfile "" ,根据个人需求配置logfile,本人配置:
logfile "/Users/wangyichao/log/redis/redis.log"
启动redis
redis启动端口号 默认为:6379,在daemonize设置为yes时候,直接为后台启动。
cd ~/software/redis-5.0.5
src/redis-server redis.conf
连接本地redis进行命令行测试
src/redis-cli
或者通过指定ip和端口号的方式请求redis,前提是需要对 redis.conf中的bind进行配置
src/redis-cli -h localhost -p 6379
redis基本概念
redis NoSQL
key-value格式基于内存的数据库
key通常情况下为string类型
value有: strings, hashes, lists, sets, sorted sets
特性:
1.速度非常快、吞吐量,官方说明 一秒10万次读写
2.持久化 有两种持久化方式 RDB 和 AOF,
RDB是定时的刷新纪录
AOF是将所有操作都记录下来
使用AOF能够完整的恢复日志
3.数据类型
strings, hashes, lists, sets, sorted sets
4.多语言开发
5.其它功能:发布定义 事务 pipeline(一次性可以发布多个请求,即批量处理)
6.单线程
7.可以搭建集群,有主从复制
redis多数据库特性
(1)默认有16个数据库,编号从0开始 。默认在0库。命令行:select 0 、select 1。。。
16这个是在redis.conf配置中写入的
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
通常情况下,大部分操作不同库的内容相互隔离。
但是有一个操作:flushall,这个操作不做隔离,所有数据都会清空,因此该操作一定要慎用。
redis基础命令
官方文档:https://redis.io/commands
set [name] [value]:设置key-value的值
keys * :查当前数据库的所有内容,keys命令支持匹配,例如keys name* 或者 keys name?或者keys name[0-9]
exists [name] :查找name是否存在,1代表存在,0代表不存在
del [name]:删除指定name
MSET :一次性设置多个key-value,例如:设置两个key-value
MSET name1 value1 name2 value2
MGET:获取多个key
MGET name1 name2
SETNX [key] [value]:当这个key不存在时,设置这个key的值,换言之,当这个key存在时,使用该命令设置key,该key值也不会发生改变。
redis 数据类型
数值类型操作:
incr [key] :将key的value值加1,注意在使用incr命令时,一定要保证key的值为数值类型,否则会报错
incrby [key] [你想要加的值] 要求加的值必须为整型
decrby [key] [你想要减的值] 要求减的值必须为整型
incrbyfloat [key][你想要加的值],要求减的值必须为浮点型,有一点需要注意,incrbyfloat 没有对应的浮点减法,但是可以通过incrbyfloat [key][负的浮点值] 来实现浮点的减法操作
字符串类型操作
append [key] [value]:对原有的值,进行拼接操作
scrlen [key]:获取key的长度
SETRANGE [key] [offset] [value]:代表从指定位置开始替换
localhost:6379> set message hello
OK
localhost:6379> get message
"hello"
localhost:6379> SETRANGE message 1 world
(integer) 6
localhost:6379> get message
"hworld"
GETRANGE [key] [start] [end]:对指定的key进行截取的操作,第一个位置为0开始,特殊使用:
-1 代表最后一个位置,-5 代表从后往前数 第五个位置
localhost:6379> set message "hello world"
OK
localhost:6379> get message
"hello world"
localhost:6379> GETRANGE message -5 -1
"world"
哈西类型的操作
HSET key field value:设置一个key的某个字段的值,有的字段进行修改,没有的新增
HMSET key field value [field value ...]:设置多个key的字段名称和value值,有的字段进行修改,没有的新增
HSETNX key field value:仅仅设置不存在的key值,对于已经存在的,不进行任何操作
HGET key field:取出一个key下面某个字段的值
HMGET key field [field ...]:取出多个key下的字段值
HGETALL key:取出一个key下的所有字段的值
HEXISTS key field:判断key下的某个字段是否存在,存在返回1,不存在返回0
HINCRBY key field increment:对key下的某个字段进行整型想加的操作
HINCRBYFLOAT key field increment:对key下的某个字段进行浮点型想加的操作
HLEN key:查看key下面有多少个字段
HVALS key:查看key下的所有值
localhost:6379> hset user:100 name testname
(integer) 1
localhost:6379> hset user:100 aget 23
(integer) 1
localhost:6379> hset user:100 weight 65.3
(integer) 1
localhost:6379> keys user*
1) "user:100"
localhost:6379> hget user:100 name
"testname"
localhost:6379> hget user:100 aget
"23"
localhost:6379> hget user:100 weight
"65.3"
localhost:6379> HGETALL user:100
1) "name"
2) "testname"
3) "aget"
4) "23"
5) "weight"
6) "65.3"
list类型的操作
list类型为有序的可重复的,和java scala的list相似
lpush
rpush
lpop 从左测弹出,显示结果并删除
rpop从右测弹出,显示结果并删除
lrange 从指定位置取
lrem 从左侧删,特殊使用
set类型的操作
set类型为无序的并且不能重复的
SDIFF set1 set2 :返回set1里面有的,set2里没有的
SINTER set1 set2 :交集
SUNION set1 set2:并集
SUNIONSTORE set1 set2 set3 把set1 、set2的元素合并到set3
SCARD key :查看set多少元素