Redis
- 简介
- 安装
- 基础使用
- 配置&说明
- 数据类型
- redis命令
- 订阅和发布
- redis事务
- redis脚本
-
Redis 连接
- Redis服务器
参考文章:
https://blog.csdn.net/u011277123/article/details/78692603/ (redis使用场景)
http://redisdoc.com/ (redis 文档)
http://www.redis.net.cn
http://try.redis.io/
http://www.redis.net.cn/order/3669.html(命令)
简介
REmote DIctionary Server(Redis 远程字典服务) 是一个key-value存储系统。支持网络、遵守BSD协议,可基于内存亦可持久化的日志型、Key-Value数据库。
BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,实现代码共享。
value支持的数据类型:
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis的特性:
1. 读写速度非常的快,读的速度是110000次/s,写的速度是81000次/s。
2.可存储在缓存区也可读写到磁盘中。
3. 具有数据库的一致性(原子)特性。
4. redis比较小仅5MB。
Redis的使用场景:
1. 短时间高并发IO操作。
2. 海量级数据的操作。
3. 数据结构复杂不适合用关系型数据库存储。
大多用于:
分布式架构的Session共享
配合关系型数据库做高速缓存
安装
下载地址:
https://github.com/MSOpenTech/redis/releases(windows下安装)
http://bitsandpieces.it/redis-x86-32bit-builds-for-windows (windows x86下载)
http://www.redis.cn/ (中国区官网)
http://redis.io/download (linux下安装)
下载后解压即可。为方便使用最好绑定到环境变量中。
http://www.runoob.com/redis/redis-install.html (查找linux下使用)
linux下:
>tar -zxf ****
>make && make install
如果出现安装失败缺少gcc则安装gcc,然后再安装应用
》yum install -y gcc texinfo-tex flex zip libgcc.i386 glibc-devel.i386
如果出现 zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
参见:https://blog.csdn.net/bugall/article/details/45914867
》make MALLOC=libc
>cd src
>./redis-server ../redis.conf
为了快速启用和使用redis可将其设置到bin中:
>cp redis-server redis-cli /usr/bin/
>cp ../redis.conf /etc/
>redis-server /etc/redis.conf
>redis-cli -h 192.168.50.128 -p 6379 --raw
》redis-cli -h 127.0.0.1 -p 6379 shutdown //停止
基础使用
redis在线测试地址:http://try.redis.io/
通过简单的语句set 和 get 语句读取数据:
>set [key] [value]
>get [key]
本地安装redis使用:
在解压包中有两个文件 :
redis-server.exe (服务端:默认端口6379)
redis-cli.exe(客户端)
首先点击redis-server.exe开启服务,不要关闭哦。
redis-server ./redis.windows.conf
然后点击redis-cli.exe打开客户端。
最简单的数据输入输出就完成了。
配置:
redis的配置在redis.config 或者 redis.window.config 下。
打开文件有关于此项配置的说明,就知道可输入的参数有哪些,配置的说明:
不过要快速查找和设置还是用命令较快。
>config get * // 查看所有配置项
>config get port // 查看端口号
>config set loglevel warning //设置配置
>config rewrite //使修改配置在下次启动有效,不然就仅仅本次
某些配置不能在命令中进行设置,需要直接修改配置文件,因为这关系到Redis服务器本身。例如:port和 daemonize等。
主要配置说明:
dbfilename : dump.rdb //默认数据库文件名
daemonize :no //守护进程为no,即依托于终端执行,一旦终端关闭则服务就停止。设为yes 则相当于服务中的 nohup命令一样。需要找到pid通过kill来杀掉进程。(在linux下有效,windows不支持)
pidfile /var/run/redis.pid // 当守护进程设置为yes时,pid会默认指向其路径。
requirepass [密码] //设置密码
常用命令:
>redis-cli -p 6380 ping //测试是否联通
>redis-cli -p 6380 -r 10 ping //测试十次用于判定网络的稳定性
>redis-cli -p 6380 set name "张三" //可应对输入时乱码问题
>select [index] //切换库分片
数据类型:
Redis支持五种常用数据类型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
geo(地理位置) --暂不做介绍
HyperLogLog(概率数据结构) --暂不做介绍
数据类型的完整命令用法:
参见:http://redisdoc.com/
String:
String 是redis最基本的类型,因为是二进制存储,所以可以存储任何编码格式字符或数据,也可存储图片或序列化对象。最大存储512MB。
使用get和set的方式进行读取。
结构:set key value
get key
127.0.0.1:6379> set userId 55112 OK 127.0.0.1:6379> get userId "55112" 127.0.0.1:6379>
》 setex name 10 "zhangsan" //保留10秒
》set name "zangs" NX //如果没有则添加
hash:
Redis hash是一种键值对集合,适合于存储对象。
每个hash可以存储 232 -1 键值对(40多亿)。
结构: Hmset key field value [field value ...]
Hget key field
127.0.0.1:6379> HMset testHs test1 zhangsan test2 lisi test3 wangwu OK 127.0.0.1:6379> HGet testHs test2 "lisi" 127.0.0.1:6379>
List:
Redis 列表是简单的字符串列表,按照顺序插入,仅可在最开始最后插入数据,不能在中间插入。最大支持 232 -1 笔数据。
结构:lpush key value [value ...]
lpop key
127.0.0.1:6379> lpush mylist zhangsan lisi wangmazi (integer) 3 127.0.0.1:6379> lpush mylist zhaosi wangjun (integer) 5 127.0.0.1:6379> lpop mylist "wangjun" 127.0.0.1:6379> lrange mylist 0 10 1) "zhaosi" 2) "wangmazi" 3) "lisi" 4) "zhangsan" 127.0.0.1:6379>
set:
Redis的Set是string类型的无序集合,最多可添加 232 - 1笔数据,但set是不允许重复的。因此如果已经存在的数据,不能被覆盖掉,会返回0,成功插入为1.
结构:sadd key member [member ...]
127.0.0.1:6379> sadd mySet 1 2 3 4 5 (integer) 5 127.0.0.1:6379> sadd mySet 67 (integer) 1 127.0.0.1:6379> sadd mySet 4 5 (integer) 0 127.0.0.1:6379> smembers mySet 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "67" 127.0.0.1:6379>
ZSet(sorted set):
zSet 和 set 集合一样都不允许重复,但是zSet会给每个成员分配一个score,这个分数可以重复,最后通过score进行从小到大排序。
结构:zadd key [NX|XX] [CH] [INCR] score member [score member ...]
127.0.0.1:6379> zadd zSet 0 zhangsan 4 wangwu 2 lisi 0 zhangming (integer) 4 127.0.0.1:6379> zadd zSet 1 zhonghua 2 zhonggong (integer) 2 127.0.0.1:6379> zrange zSet 0 0 1) "zhangming" 127.0.0.1:6379> zrange zSet 0 6 1) "zhangming" 2) "zhangsan" 3) "zhonghua" 4) "lisi" 5) "zhonggong" 6) "wangwu" 127.0.0.1:6379>
redis命令
客户端启动命令: > redis-cli //注意Redis要在环境变量中才可以
检查服务端是否连接: >ping // 结果会是pong
远程访问Redis服务:
首先确保本地有Redis的客户端。以本地演示为例:
修改redis.windows-service.conf文件:
1. 注释掉 bind 127.0.0.1,(注释用#)这样就可以通过外部访问
C:\Users\zhaoq>redis-cli -h 192.168.202.67 -p 6379 192.168.202.67:6379>
2. 给服务端添加密码 : 放开 # requirepass foobared。 修改foobared为自己的密码
或者为: redis-cli -h [ip] -p [port] -a [pwd]
C:\Users\zhaoq>redis-cli -h 192.168.202.67 -p 6380 192.168.202.67:6380> get userName (error) NOAUTH Authentication required. 192.168.202.67:6380> auth dennyzhao OK 192.168.202.67:6380>
keys:
键命令用于管理和操作redis 的键。
>keys * //查看所有的key,可支持pattern
>exists [key] //查找key是否存在
>dump [key] //序列化key对象
>del [key] //删除key,不支持模糊删除
具体命令参见: http://redisdoc.com/key/index.html
其它数据类型在此不再陈述。
订阅和发布
redis通过订阅和发布模式实现数据的缓存和获取,即数据推送。
比如一个客户端作为主播(推送者)publish一个cctv1频道,有两个观众订阅(接收者)subscribe这个cctv1频道,这样主播发布的节目观众就可以实时看到。
> publish cctv1 // 发布频道节目
>subscribe cctv1 // 订阅频道节目
>pubsub channels // 查看自己的发布或订阅
具体命令介绍参见 : http://redisdoc.com/pub_sub/index.html
Redis事务
redis事务不同于数据库的事务,数据库的事务可以设置多种策略,事务具有一致性,而redis的事务仅仅将redis命令放在一起,统一执行。
步骤:开始事务(multi)-》命令入队-》执行事务(exec)
redis的原子性指单条命令的行为具有一致性,但在事务中不具备原子性。单个命令在执行过程中的成功与失败,不会回滚上一命令的结果,也不会影响下一命令的执行。
127.0.0.1:6380> multi OK 127.0.0.1:6380> set username zhangsan QUEUED 127.0.0.1:6380> get username QUEUED 127.0.0.1:6380> keys * QUEUED 127.0.0.1:6380> exec 1) OK 2) "zhangsan" 3) 1) "username" 127.0.0.1:6380>
具体命令介绍参见 : http://redisdoc.com/transaction/index.html
Redis脚本
Redis 脚本使用 Lua 解释器来执行脚本。目前内嵌有Lua环境。
*Lua由标准C编写而成,可在任何运行平台和环境中运行的内嵌入语音,Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,
Lua的速度是最快的。这一切决定Lua是作为嵌入式脚本的最佳选择。
redis使用EVAL来执行脚本。
以下的脚本说明执行结构:
eval script numkeys [key ....] [argv......]
key的占位符一定要用大写的KEYS[num],同样参数也是ARGV[num].num表示了数据的位置。
127.0.0.1:6380> eval "return {KEYS[1],KEYS[2],KEYS[3],ARGV[1],ARGV[3],ARGV[2]}" 3 id code name 1111 wangwu 5267 1) "id" 2) "code" 3) "name" 4) "1111" 5) "5267" 6) "wangwu"
在lua脚本中使用 redis.call() 或者 redis.pcall() 函数执行redis命令。
127.0.0.1:6380> eval "redis.call('set', KEYS[1], ARGV[1])" 1 user wangmazi (nil) 127.0.0.1:6380> get user "wangmazi" 127.0.0.1:6380>
注意:script脚本要用双引号,命令或内容非占位符要使用单引号。
具体命令介绍参见 :http://redisdoc.com/script/eval.html
Redis 连接
在前面已经讲过,redis的基本连接
>redis-cli -h [ip] -p [port] -a [pwd]
在没有输入密码的情况下redis-cli -h [ip] -p [port]
然后再补密码:
>auth [pwd]
>echo [message] //回显输入内容
>ping //测试连接是否畅通 回应 pong
>quit //关闭当前连接
Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
127.0.0.1:6380> set db_number 0 OK 127.0.0.1:6380> select 1 OK 127.0.0.1:6380[1]> set db_number 1 OK 127.0.0.1:6380[1]> select 1 OK 127.0.0.1:6380[1]> select 0 OK 127.0.0.1:6380> set db_number 2 OK 127.0.0.1:6380> set db_number 3 OK 127.0.0.1:6380> select 2 OK 127.0.0.1:6380[2]>
具体命令介绍参见 :http://redisdoc.com/connection/index.html
Redis服务器
通过info命令可以查看到服务器的所有信息配置。
>info
临时存储的数据都在缓存中,要写入磁盘用
>save
>client list //当前了解的用户数
>time //当前时间
具体命令介绍参见 : http://redisdoc.com/server/index.html