Redis 十分钟快速入门
本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用。
1. Redis简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
2.Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制的字符串、列表、哈希值、集合和有序集合等数据类型操作。
- 原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行
- 单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 发布/订阅, 通知, key 过期等等特性
3.安装
- redis-windows :https://github.com/ServiceStack/redis-windows
- redis服务端下载 :https://github.com/ServiceStack/redis-windows/raw/master/downloads/redis-latest.zip
- redis客户端下载 :https://redisdesktop.com/download
- redis官网 :https://redis.io
- redis中文网:http://www.redis.cn/documentation.html
3.1 Window下安装
redis-server.exe redis.windows.conf
redis-cli.exe -h 127.0.0.1 -p
3.2 Mac下安装
brew install redis
brew services start redis
redis-server /usr/local/etc/redis.conf
3.3 配置
CONFIG GET CONFIG_SETTING_NAME
CONFIG GET port
4. 数据类型
- 字符串
- 哈希值
- 链表
- 集合
- 有序列表
4.1 字符串
字符串是最基本的类型,一个key对应一个value
4.1.1 SET 设置值
127.0.0.1:> SET name xiaoming
"OK"
4.1.2 GET 获取值
127.0.0.1:> GET name
"xiaoming"
4.1.3 GETRANGE 获取子串
获取字符串区间 GETRANGE key start end
127.0.0.1:6379>GETRANGE name 1 2
"ia"
支持负索引
127.0.0.1:6379> GETRANGE name 1 -1
"iaoming"
4.1.4 INCR INCRBY 递增
127.0.0.1:> SET age
OK
127.0.0.1:> INCR age
(integer)
增加n个
127.0.0.1:6379> INCRBY age 5
(integer) 7
DECR 减1
127.0.0.1:6379>DECR age
(integer) 6
DECRBY 减 n
127.0.0.1:> decrby age
(integer) -
4.1.5 键
DEL key 删除 key
DEL user
EXISTS key 判断一个key是否存在
EXISTS user
EXPIRE key seconds 设置过期时间
EXPIRE user
TTL key 以秒为单位返回给定key的剩余生存时间
TTL user
127.0.0.1:> SET homepage index.html
OK
127.0.0.1:> GET homepage
"index.html"
127.0.0.1:> EXPIRE homepage
(integer)
127.0.0.1:> TTL homepage //此时已经过期
(integer) -
127.0.0.1:> GET homepage
(nil)
TYPE key 返回key所存储的值的类型
TYPE user
127.0.0.1:6379> TYPE name
string
4.2 哈希值
哈希值是一个字符串类型的Key和值的映射表,特别适合用于存储对象。
4.2.1 HSET HMSET 设置值
HSET person name 设置单个值
HMSET user name zfpx age 设置多个值
设置单个值
127.0.0.1:> HSET user name xiaoming //设置user:name的值
(integer)
127.0.0.1:> HGET user name
"xiaoming"
127.0.0.1:> HSET user age
(integer)
127.0.0.1:> HGETALL user //获取user所有的值
) "name"
) "xiaoming"
) "age"
) ""
设置多个值
127.0.0.1:> HMSET mert gender man home bj
(integer)
127.0.0.1:> HGETALL mert
) "gender"
) "man"
) "home"
) "bj"
4.2.2 HGET HGETALL 获取值
HGET user name 获取单个值
HMGET user name age 获取多个值
HGETALL user 获取多有值
4.2.3 HDEL key field 删除键
HDEL key field
HDEL user name
HGETALL user
删除某个属性
127.0.0.1:6379> HDEL mert home
(integer) 1
127.0.0.1:6379> HGETALL mert
1) "gender"
2) "women"3) "bj"
4.2.3 HKEYS 获取所有的KEYS
HKEYS user
4.3 列表
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
4.3.1 LPUSH RPUSH 添加元素
返回列表的长度
LPUSH ids
LPUSH ids
RPUSH ids
RPUSH ids
RPUSH ids
4.3.2 LRANGE 查看元素
LRANGE ids 0 2
LRANGE ids 0 -1
LRANGE[list] 0 -1 获取list 所有数据 可输入区间
127.0.0.1:> lpush ids
(integer)
127.0.0.1:> lpush ids
(integer)
127.0.0.1:> rpush ids
(integer)
127.0.0.1:> rpush ids
(integer)
127.0.0.1:> LRANGE ids -
) ""
) ""
) ""
) ""
127.0.0.1:> LRANGE ids ) "" ) ""
4.3.3 LPOP RPOP 弹出元素
查看并删除
LPOP ids
RPOP ids
127.0.0.1:6379> LPOP ids//删除最左边数据
"3"
127.0.0.1:6379> RPOP ids//删除最右边数据
"4"
127.0.0.1:6379> LRSNGE ids 0 -1 //查看list表
1) "2"
2) "1"
4.3.4 LINDEX ids 1
通过索引获取列表中的元素
LINDEX ids 0
127.0.0.1:6379> LINDEX ids 1
"1"
127.0.0.1:6379> LINDEX ids 0
"2"
4.3.5 LLEN key
获取列表长度
LLEN ids
127.0.0.1:6379> LLEN ids
(integer) 2
4.3.6 LREM key count value
移除列表元素
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
- count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
- count = 0 : 移除表中所有与 VALUE 相等的值。
例如:
LREM [list] 0 2 删除所有的2 0代表删除所有 2代表要删除的数据
LREM [list] 2 1 删除 2个1 2代表删除2个 1代表要删除的数据
从右边删除 LREM [list] -2 1 删除 2个1 2代表删除2个 1代表要删除的数据
//先创建一个表
127.0.0.1:> Lpush id
(integer)
127.0.0.1:> Lpush id
(integer)
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> LRANGE id - //查看表中所有数据
) ""
) ""
) ""
) ""
) ""
) ""
//如果删除2个1
127.0.0.1:> LREM id
(integer)
127.0.0.1:> LRANGE id -
) ""
) ""
) ""
) ""
//如果想要删除最后一个值1
127.0.0.1:> LREM id - //-1相当于从右边找删除1
(integer)
127.0.0.1:> LRANGE id -
) ""
) ""
) ""
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> RPUSH id
(integer)
127.0.0.1:> LRANGE id -
) ""
) ""
) ""
) ""
) ""
127.0.0.1:> LREM id - //从右边删除2个数据4
(integer)
127.0.0.1:> LRANGE id -
) ""
) ""
) ""
4.4 集合
集合是字符串类型的无序集合
4.4.1 SADD 添加
如果集合中已经存在指定的元素则返回0,如果不存在则添加成功返回1
SADD tags 1
SADD tags 2
SADD tags 2
SADD tags 3
SADD tags 4 5 6
SMEMBERS tags
4.4.2 SMEMBERS 查看集合
SMEMBERS tags
4.4.3 SCARD 获取集合元素个数
SCARD tags
4.4.4 SREM 删除元素
SREM tags member
SREM tags 4
SMEMBERS tags
案例:
127.0.0.1:6379> SADD tages 1 //添加数据
(integer) 1
127.0.0.1:6379> SADD tages 1
(integer) 0
127.0.0.1:6379> SADD tages 2
(integer) 1
127.0.0.1:6379> SADD tages 3
(integer) 1
127.0.0.1:6379> SADD tages 4
(integer) 1
127.0.0.1:6379> SADD tages 5 6
(integer) 2
127.0.0.1:6379> SMEMBERS tages //查看集合
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SCARD tages //查看集合长度
(integer) 6
127.0.0.1:6379> SREM tages 4 //删除数据4
(integer) 1
127.0.0.1:6379> SMEMBERS tages
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
127.0.0.1:6379> SCARD tages
(integer) 5
4.4.5 集合运算
SADD A 1 2 3
SADD B 2 3 4
SINTER A B 交集
SDIFF A B 差集
SUNION A B 并集
查看集合是否有交集(相同的数据) SINTER
查看两个集合的差集 SDIFF A-B(A有B没有的)
查看两个集合的并集 SUNION (AB并到一起)
127.0.0.1:> SADD A
(integer)
127.0.0.1:> SADD B
(integer)
127.0.0.1:> SINTER A B // 交集
) ""
) ""
127.0.0.1:> SDIFF A B //差集
) ""
127.0.0.1:> SUNION A B //并集
) ""
) ""
) ""
) ""
4.5 有序集合
有序集合和集合一样也是字符串的集合,而且不能重复 不同之外是每个集合都会关联一个double类型的分数,redis可以通过这个分类来为集合中的元素进行从小到大排序,元素不能重复,但分数可以重复
4.5.1 ZADD 添加元素
ZADD key score1 member1 [score2 member2] ZADD levels 1 one
ZADD levels 2 two
ZADD levels 3 three
ZADD levels 4 four
4.5.2 ZCARD 获取有序集合的成员数
ZCARD key
ZCARD levels
4.5.3 ZRANGE 查看有序集合
ZRANGE levels 0 -1 按范围查看
ZRANGE levels 0 2 WITHSCORES 按范围查看,并显示分数
4.5.4 ZREM 移除有序集合中的一个或多个成员
ZREM key member [member ...]
ZADD levels 1 one
ZADD levels 2 two
ZREM levels one
ZRANGE levels 0 -1
案例:
127.0.0.1:6379> ZADD stus 60 zhangsan 90 lis 65 ww
(integer) 1
127.0.0.1:6379> ZRANGE stus 0 -1
1) "zhangsan"
2) "ww"
3) "lis"
127.0.0.1:6379> ZADD stus 86 zhaoliu
(integer) 1
127.0.0.1:6379> ZRANGE stus 0 -1 //查看所有属性
1) "zhangsan"
2) "ww"
3) "zhaoliu"
4) "lis"
127.0.0.1:6379> ZRANGE stus 0 -1 WITHSCORES // 查看属性和值
1) "zhangsan"
2) "60" //从结果可以看出最新插入的数据被有序的排列了,并没有查到最后
3) "ww"
4) "65"
5) "zhaoliu"
6) "86"
7) "lis"
8) "90"
127.0.0.1:6379> ZREM stus lis // 删除属性
(integer) 1
127.0.0.1:6379> ZRANGE stus 0 -1 WITHSCORES
1) "zhangsan"
2) "60"
3) "ww"
4) "65"
5) "zhaoliu"
6) "86"
5. Node.js中的使用
创建测试文件夹 node-redis
进入文件夹执行
npm install redis
创建一个index.js
里面的内容如下:
const redis = require('redis')
const client = redis.createClient(6379,'localhost')
client.on('error',function(err){
console.log(err)
})
client.set('home','beijing',function(err,result){
console.log(arguments)
})
//p1 ={suername:'xiaoming',age:9}
client.hmset('p1','username','xiaoming','age','9',function(err,result){
console.log(err)
console.log(result)
})
执行一下
node index.js
此时
127.0.0.1:6379> get home
"beijing"
127.0.0.1:6379> hmget p1 username age
1) "xiaoming"
2) "9"
HKEYS 获取p1的所有属性
127.0.0.1:6379> HKEYS p1
1) "username"
2) "age"
获取p1的键和值的node写法
client.hkeys('p1', function(err,keys) {
// console.log(keys) [ 'username', 'age' ]
keys.forEach(function(key,index,keys){
client.hget('p1',key,function(err,value){
console.log(key,value) //username xiaoming
// age 9
})
})
})
6. Redis发布订阅
Redis 发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息,客户端可以订阅任意数量的频道。
SUBSCRIBE chat
PUBLISH chat zfpx
node.js版的发布订阅
const redis = require('redis')
let client1 = redis.createClient(6379, '127.0.0.1');
let client2 = redis.createClient(6379, '127.0.0.1');
let count = 0;
client1.subscribe('food');//监听
client1.subscribe('drink');
client1.on('message', function (channel, message) {
console.log(channel, message);
client1.unsubscribe('food');//停止监听以后再也不接受食品频道的消息了
});
client2.publish('food', '面包');//发布
client2.publish('drink', '桔汁');
setTimeout(() => {
client2.publish('food', '面包2');
client2.publish('drink', '桔汁2');
}, 2000);
7. Redis事务
Redis 事务可以一次执行多个命令
- 多个命令可以在执行EXEC命令之前放入缓存队列
- 收到EXEC命令后会将缓存队列执行
- 在执行事务的过程中,新提交的并不能被插入到事务执行序列中
DISCARD 可以取消事务,放弃执行事务块内的所有命令
127.0.0.1:6379> MULTI
127.0.0.1:6379> SET chet1 1
QUEUED
127.0.0.1:6379> SET chet2 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
127.0.0.1:6379> GET chet1
"1"
127.0.0.1:6379> GET chet2
"3"- 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
- 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做
let redis = require('redis')
let client = redis.createClient(6379,'localhost')
client.multi().set('k3','v3').set('k4','v4').get('k4').exec(function(err,result){
console.log(err)
console.log(result)
})
执行以后的结果为
null
[ 'OK', 'OK', 'v4' ]
8. 备份与恢复
8.1 备份
127.0.0.1:6379> SAVE
OK
该命令将在 redis 安装目录中创建dump.rdb文件。
8.2 恢复
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务
CONFIG GET dir
BGSAVE
9. 安全
可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG set requirepass 'mima'
OK
127.0.0.1:6379> CONFIG get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH mima
OK
127.0.0.1:6379> CONFIG get requirepass
Redis 十分钟快速入门的更多相关文章
- 十分钟快速入门 Python,看完即会,不用收藏!
本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...
- 十分钟快速入门 Python
本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...
- python视频教程:十分钟快速入门python
想要学习python这门语言,却始终找不到一个全面的Python视频教程,倘若你是真心想学好一门语言,小编建议你亲自动手实践的.下面来看看入门python的学习教程. Python的语言特性 Pyth ...
- HDFS+MapReduce+Hive+HBase十分钟快速入门
1. 前言 本文的目的是让一个从未接触Hadoop的人,在很短的时间内快速上手,掌握编译.安装和简单的使用. 2. Hadoop家族 截止2009-8-19日,整个Hadoop家族由以 ...
- Python语言十分钟快速入门
Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. AD:[51CTO技术沙龙]移动时代 ...
- 一分钟快速入门openstack
一.它是什么,能干什么想认识一个事物,必须先弄明白它是什么,能干什么.首先说一下,openstack是一个搭建云平台的一个解决方案,说他不是个软件,但是我觉得说是一个软件,能够让大家认识更清晰些.op ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(四)
本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(三)
声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
随机推荐
- input type="number"时,maxlength不起作用怎么解决
最近小颖在做公司的angular项目时,发现当input type="number"时,maxlength不起作用,百度了下解决方式,顺便记录下,以便后期查看嘻嘻 <inpu ...
- linux学习路线图
- php strpos(), stripos(),strrpos(), strripos()的区别
strpos(), 左边开始,字符出现第一个位置,区分大小写: stripos(),不区分大小写: strrpos(), 左边开始,字符出现,最后一个位置,区分大小写: strripos()不区分大小 ...
- IIS "rewrite.dll failed to load. The data is the error." 错误解决方法
在Windows 10 build 17133.73上部署一个较老版本的ASP.NET 2.0程序,访问时候出现: Service Unavailable HTTP Error 503. The se ...
- Centos 7.x系统安装后的初始化配置
1.配置IP.网关,编辑/etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE=Ethernet BOOTPROTO=none //默认为dhcp ...
- iOS 面试题整理(带答案)二
第一篇面试题整理: http://www.cocoachina.com/bbs/read.php?tid-459620.html 本篇面试题同样:如答案有问题,欢迎指正! 1.回答person的ret ...
- mysql的sql优化
https://dev.mysql.com/doc/refman/8.0/en/statement-optimization.html 8.2 Optimizing SQL Statements 8. ...
- wpgcms---流程控制
在模板里面Twig标签语法的时候,很多时候会用到流程控制. if 判断: {% if true %} {% endif %} // 示例 {% if item.href %} href="{ ...
- Pointer Lock
Pointer Lock API 指针锁定(以前叫做 鼠标锁定) 提供了一种输入方法,这种方法是基于鼠标随着时间推移的运动的(也就是说,deltas),而不仅是鼠标光标的绝对位置.通过它可以访问原始的 ...
- PHP配置xcache缓存扩展
安装步骤 wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz tar -xf xcache-3.2.0.tar ...