1redis 是什么
redis 是一个开源的, 使用 C 语言编写的, 支持网络交互的, 可基于内存也可持久化的 Key-Value 数据库.
redis 的官网地址, 非常好记, 是 redis.io. 目前, Vmware 在资助着 redis 项目的开发和维护.
redis 的作者何许人也? 开门见山, 先看照片:
是不是出乎了你的意料, 嗯, 高手总会有些地方与众不同的.
这位便是 redis 的作者, 来自意大利的西西里岛, 现在居住在卡塔尼亚.
他使用的网名是 antirez, 如果你有兴趣, 可以去他的博客逛逛, 地址是 antirez.com, 当然也可以去 follow 他的 github, 地址是
http://github.com/antirez.
随着应用对高性能需求的增加, NoSQL 逐渐在各大名企的系统架构中生根发芽. 时至今日, 涌现出的 NoSQL 产品已经有很多种了, 例如 Membase,MongoDB,Apache Cassandra,CouchDB 等. 不过, 在国内外互联网巨头例如社交巨头新浪微博, 传媒巨头 Viacom 及图片分享领域佼佼者 Pinterest 等名企都不约而同地采用了 Redis 作为其 NoSQL 数据库的选择, 到底 Redis 是何方神圣呢? 能让如此多的名企为它而痴狂.
按照官方的说法, Redis 是一个开源的, 使用 C 语言编写, 面向 "键 / 值"(Key/Value) 对类型数据的分布式 NoSQL 数据库系统, 特点是高性能, 持久存储, 适应高并发的应用场景. 因此, 可以说 Redis 纯粹为应用而产生, 它是一个高性能的 key-value 数据库, 并且还提供了多种语言的 API(包括我们的大 C#). 那么, 也许我们会问: 到底性能如何呢? 以下是官方的 bench-mark 数据:
1. 测试完成了 50 个并发执行 100000 个请求.
2. 设置和获取的值是一个 256 字节字符串.
3.Linux box 是运行 Linux 2.6, 这是 X3320 Xeon 2.5 ghz.
4. 文本执行使用 loopback 接口 (127.0.0.1).
5 结果: 读的速度是 110000 次 / s, 写的速度是 81000 次 / s .(当然不同的服务器配置性能也有所不同)
Redis 支持存储的 value 类型相对更多, 包括 string(字符串),list(链表),set(集合),zset(sorted set -- 有序集合) 和 hash(哈希类型). 这些数据类型都支持 push/pop,add/remove 及取交集并集和差集及更丰富的操作, 而且这些操作都是原子性的. 在此基础上, Redis 支持各种不同方式的排序. 与 Memcached 一样, 为了保证效率, 数据都是缓存在内存中. 区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件, 并且在此基础上实现了 master-slave(主从) 同步 (数据可以从主服务器向任意数量的从服务器上同步, 从服务器可以是关联其他从服务器的主服务器.). 因此, Redis 的出现, 很大程度补偿了 Memcached 这类 key/value 存储的不足, 在部分场合可以对关系数据库起到很好的补充作用.
2redis 安装
导入安装包
编译 (make)
从 redis.io 下载最新版 redis-X.Y.Z.tar.gz 后解压, 然后进入 redis-X.Y.Z 文件夹后直接 make 即可, 安装非常简单. make 成功后会在 src 文件夹下产生一些二进制可执行文件, 包括 redis-server,redis-cli 等:
$ find . -type f -executable
- ./redis-benchmark // 用于进行 redis 性能测试的工具
- ./redis-check-dump // 用于修复出问题的 dump.rdb 文件
- ./redis-cli //redis 的客户端
- ./redis-server //redis 的服务端
- ./redis-check-aof // 用于修复出问题的 AOF 文件
- ./redis-sentinel // 用于集群管理
编译安装 (make install)
把编译好的文件安装到指定目录
前端启动
直接运行 bin/redis-server 将以前端模式启动, 前端模式启动的缺点是 ssh 命令窗口关闭则 redis-server 程序结束, 不推荐使用此方法. 如下图:
后端启动
修改 redis.conf 配置文件, daemonize yes 以后端模式启动.
执行如下命令启动 redis:
cd /usr/local/redis
./bin/redis-server ./redis.conf
redis 默认使用 6379 端口
也可更改 redis.conf 文件, 修改端口号:
使用 redis 客户端
使用 redis 内置客户端, 必须先启动 redis 服务端.
// 这样来启动 redis 客户端了
$ ./redis-cli
- // 用 set 指令来设置 key,value
- 127.0.0.1:6379> set name 'roc'
- OK
- // 来获取 name 的值
- 127.0.0.1:6379> get name
- 'roc'
- // 通过客户端来关闭 redis 服务端
- 127.0.0.1:6379> shutdown
- 127.0.0.1:6379>
3redis 的数据结构
redis 是一种高级的 key:value 存储系统, 其中 value 支持五种数据类型:
1. 字符串 (strings)
2. 字符串列表 (lists)
3. 字符串集合 (sets)
4. 有序字符串集合 (sorted sets)
5. 哈希 (hashes)
而关于 key, 有几个点要提醒大家:
1.key 不要太长, 尽量不要超过 1024 字节, 这不仅消耗内存, 而且会降低查找的效率;
2.key 也不要太短, 太短的话, key 的可读性会降低;
3. 在一个项目中, key 最好使用统一的命名模式, 例如 user:10000:passwd.
有人说, 如果只使用 redis 中的字符串类型, 且不使用 redis 的持久化功能, 那么, redis 就和 memcache 非常非常的像了. 这说明 strings 类型是一个很基础的数据类型, 也是任何存储系统都必备的数据类型.
我们来看一个最简单的例子:
代码如下:
- set mystr 'hello world!' // 设置字符串类型
- get mystr // 读取字符串类型
字符串类型的用法就是这么简单, 因为是二进制安全的, 所以你完全可以把一个图片文件的内容作为字符串来存储.
另外, 我们还可以通过字符串类型进行数值操作:
代码如下:
- 127.0.0.1:6379> set mynum '2'
- OK
- 127.0.0.1:6379> get mynum
- '2'
- 127.0.0.1:6379> incr mynum
- (integer) 3
- 127.0.0.1:6379> get mynum
- '3'
由于 INCR 等指令本身就具 有原子操作的特性, 所以我们完全可以利用 redis 的 INCR,INCRBY,DECR,DECRBY 等指令来实现原子计数的效果, 假如, 在某种场景下有 3 个客户端同时读取了 mynum 的值 (值为 2), 然后对其同时进行了加 1 的操作, 那么, 最后 mynum 的值一定是 5. 不少网站都利用 redis 的这个特性来实现业务上的统计计数需求.
来源: http://www.92to.com/bangong/2018/04-13/33562400.html