Redis 学习笔记
1 Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
2.1 安装redis
下载redis安装包(如: redis-2.8.17.tar.gz )
tar -zxvf redis-2.8.17.tar.gz
cd redis-2.8.17
make
sudo make install
2.2 后台启动服务端
nohup redis-server &
注 :redis-server默认启动端口是6379,没有密码
如果不使用默认配置文件,启动时可以加上配置文件
nohup redis-server ~/soft/redis-2.8.17/redis.conf &
2.3 启动客户端、验证
127.0.0.1:6379> ping
PONG 127.0.0.1:6379> set var "hello world"
OK
127.0.0.1:6379> get var
"hello world"
2.4 退出
关闭redis-server
redis-cli shutdown
例子
$ps -ef | grep redis
root 23422 19813 0 10:59 pts/5 00:00:08 redis-server *:6379 $sudo redis-cli shutdown
[23422] 05 Mar 12:11:29.301 # User requested shutdown...
[23422] 05 Mar 12:11:29.301 * Saving the final RDB snapshot before exiting.
[23422] 05 Mar 12:11:29.314 * DB saved on disk
[23422] 05 Mar 12:11:29.314 # Redis is now ready to exit, bye bye...
[1]+ Done sudo redis-server (wd: ~/soft/redis-2.10.3)
(wd now: ~/soft/redis-2.8.17) $ps -ef | grep redis
wzh94434 30563 19813 0 12:11 pts/5 00:00:00 grep redis
注 :如果设置上 密码 后,单纯的redis-cli是关不掉的,必须加上ip、port、passwd
sudo redis-cli -h host -p port -a passwd shutdown
退出客户端
localhost:6379> QUIT
2.5 设立密码
打开redis.conf找到requirepass,去掉默认,修改
requirepass yourpassword
验证密码的正确性
localhost:6379> auth jihite
OK
2.6 远程连接
需要已经安装redis,可以使用redis-cli命令
redis-cli -h host -p port -a password
2.7 查看redis-server统计信息
INFO
3. Reis key
Redis是key-value的数据库,Redis的键用于管理Redis的键,基本语法是
COMMAND KEY_NAME
例子:
localhost:6379> SET var redis
OK
localhost:6379> GET var
"redis"
localhost:6379> DEL var
(integer) 1
localhost:6379> GET var
(nil)
注 :redis命令不区分大小写,所以get var和GET var是等价的
序号 | Redis keys命令及描述 |
---|---|
1 | DEL key该命令用于在 key 存在是删除 key。 |
2 | DUMP key序列化给定 key ,并返回被序列化的值。 |
3 | EXISTS key检查给定 key 是否存在。 |
4 | EXPIRE key seconds为给定 key 设置过期时间。 |
5 | EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds设置 key 的过期时间亿以毫秒计。 |
7 | PEXPIREAT key milliseconds-timestamp设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
8 | KEYS pattern查找所有符合给定模式( pattern)的 key 。例如keys * 返回所有的key |
9 | MOVE key db将当前数据库的 key 移动到给定的数据库 db 当中。 |
10 | PERSIST key移除 key 的过期时间,key 将持久保持。 |
11 | PTTL key以毫秒为单位返回 key 的剩余的过期时间。 |
12 | TTL key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
13 | RANDOMKEY从当前数据库中随机返回一个 key 。 |
14 | RENAME key newkey修改 key 的名称 |
15 | RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey 。 |
16 | TYPE key返回 key 所储存的值的类型。 |
4. Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
4.1 String(字符串)
- 是Redis最基本的数据类型,可以理解成与Memcached一模一样的类型,一个key对应一个value
- 二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象
- 一个键最大能存储 512MB
例子
set myredis 'kmonkeywyl'
get myredis
说明:利用set给变量var赋值“String type”;利用get获得变量var的值
4.2 Hash(哈希)
- 是一个键值对集合
- 是一个string类型的field和value的映射表,hash特别适合用于存储对象
例子
//建立哈希,并赋值
HMSET user:001 username wylpassword 111 age 34
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "111"
5) "age"
6) "34"
//更改哈希中的某一个值
HSET user:001 password 12345
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "12345"
5) "age"
6) "34"
说明
var:1是键值,每个 hash 可以存储 2 32 - 1 键值对(40多亿)
HMSET用于建立hash对象,HGETALL用于获取hash对象
4.3 LIST(列表)
例子
//新建一个list叫做mylist,并在列表头部插入元素"1"
lpush mylist "1"
//在mylist右侧插入元素"2"
rpush mylist "2"
//在mylist左侧插入元素"0"
lpush mylist "0"
//列出mylist中从编号0到编号1的元素
lrange mylist 0 1
//列出mylist中从编号0到倒数第一个元素
lrange mylist 0 -1
说明
lpush往列表的前边插入;lrange后面的数字是范围(闭区间)
redis中的lists在底层实现上并不是数组,而是链表.所以插入数据快,但定位性能操作较差。
lists的常用操作包括lpush、rpush、lpush,lrange等
列表最多可存储 2 32 - 1 元素 (4294967295, 每个列表可存储40多亿)。
4.4 Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
例子
//向集合myset中加入新元素"wyl"
sadd myset "wyl"
(integer) 1
sadd myset "kmonkey"
(integer) 1
//列出集合myset中的所有元素
smembers myset
1) "wyl"
2) "kmonkey"
//判断元素1是否在集合myset中,返回1表示存在
sismember myset "wyl"
(integer) 1
//判断元素是否在集合myset中,返回0表示不存在
sismember myset "wangyanling"
(integer) 0
//新建一个新的集合yourset
sadd yourset "1"
(integer) 1
sadd yourset "2"
(integer) 1
smembers yourset
1) "1"
2) "2"
//对两个集合求并集
sunion myset yourset
1) "1"
2) "wyl"
3) "2"
4) "kmonkey"
说明
set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0,例子中mongodb第二次插入时,因已经存在,故插入失败。
4.5 zset(sorted sete:有序集合)
zset和set一样也是String类型的集合,且不允许元素重复
zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序
zset的元素是唯一的,但是分数是可以重复的
例子
zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
zadd myzset 3 360.com
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"
说明
成功插入返回1,否则返回0。插入已存在元素失败--返回0
分数为float(可正、负、0)
5. Redis HyperLogLog
Redis HyperLogLog是用来做基数统计的算法。优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
注 :因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,因此不会返回输入的各个元素。
基数是什么? 对于["abc", "abc", "2", "3"],基数是["abc", "2", "3"],个数是3.
例子
localhost:6379> pfadd jsh redis
(integer) 1
localhost:6379> pfadd jsh redis
(integer) 0
localhost:6379> pfadd jsh mongodb
(integer) 1
localhost:6379> pfadd jsh rabbitmq
(integer) 1
localhost:6379> pfcount jsh
(integer) 3
localhost:6379> pfadd jsh2 redis
(integer) 1
localhost:6379> pfadd jsh2 a
(integer) 1
localhost:6379> pfcount jsh2
(integer) 2 localhost:6379> pfmerge jsh jsh2
OK
localhost:6379> pfcount jsh
(integer) 4
localhost:6379> pfcount jsh2
(integer) 2
说明:
- pfadd key ele [ele2 ...]:添加指定元素到HyperLogLog中,
- pfcount key: 返回给定HyperLogLog的基数估算值
- pfmerge destkey srckey [srckey2....]:讲多个HyperLogLog合并到一个第一个HyperLogLog中
6. Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
原理:下图展示了三个客户端client1, client2, client5订阅了频道channel1
当有新消息通过PUBLISH发送给channel1时,这时候channel1就会把消息同时发布给订阅者
例子
创建订阅频道redisChat
localhost:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
打开几个客户端,订阅channel redisChat
localhost:6379> psubscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "redisChat"
3) (integer) 1
然后给channel redisChat发送消息“Hello World”
localhost:6379> publish redisChat "Hello World"
(integer) 1
客户端会收到消息
Reading messages... (press Ctrl-C to quit)
1) "pmessage"
2) "redisChat"
3) "redisChat"
4) "Hello World"
7. Redis事务
事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),执行一个事务中的命令时不会被其他命令打断。
一个事务从开始到结束经过以下三个阶段:
- 开始事务
- 命令入队
- 执行事务
例子
localhost:6379> MULTI
OK
localhost:6379> set name jihite
QUEUED
localhost:6379> get name
QUEUED
localhost:6379> sadd language "c++" "python" "java"
QUEUED
localhost:6379> smembers language
QUEUED
localhost:6379> exec
1) OK
2) "jihite"
3) (integer) 3
4) 1) "java"
2) "python"
3) "c++"
说明:事务以MULTI开始,以EXEC结束
8. Redis脚本
Redis 脚本使用 Lua 解释器来执行脚本。执行脚本的常用命令为 EVAL 。基本语法
EVAL script numkeys key [key ...] arg [arg ...]
例子
localhost:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
9. 数据备份与恢复
数据备份
localhost:6379> save
OK
改命令会在redis的安装目录中创建文件dump.rdb,并把数据保存在该文件中。
查看redis的安装目录
localhost:6379> config get dir
1) "dir"
2) "/home/jihite/soft/redis-2.8.17"
数据恢复
只需将备份文件dump.rdb拷贝到redis的安装目录即可。
10. 数据库操作
Redis中,一共有16个数据库,分别是0~15,一般情况下,进入数据库默认编号是0,如果我们要进入指定数据库,可以用select语句
切换到编号为3的数据库
localhost:6379> select 3
OK
localhost:6379[3]>
查看数据库中所有的键值
localhost:6379[1]> set a 1
OK
localhost:6379[1]> set b 2
OK
localhost:6379[1]> keys *
1) "b"
2) "a"
返回当前数据库中所有key的数目: dbsize
删除当前数据库中的所有key: flushdb
清空所有数据库中的所有key: flushall
把当前数据库中的key转移到指定数据库:move a aim_db,例:
localhost:6379[1]> set z sss
OK
localhost:6379[1]> move z 0
(integer) 1
localhost:6379[1]> select 0
OK
localhost:6379> get z
"sss"
Redis 学习笔记的更多相关文章
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记7--Redis管道(pipeline)
redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(二)-key相关命令【转载】
转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...
- Redis学习笔记(三)Redis支持的5种数据类型的总结
继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
随机推荐
- 利用Canvas进行绘制XY坐标系
首先来一发图 绘制XY的坐标主要是利用Canvas setLeft和setBottom功能(Canvas内置坐标的功能) 1.首先WPF中的坐标系都是从左到右,从上到下的 即左上角位置(0,0)点,所 ...
- BatsingJSLib 2.3、Ajax上传多个文件
//2.3Ajax上传单个或多个文件 //<input type="file" multiple="multiple"/> //参数:文件的表单JD ...
- [MCSM]随机搜索和EM算法
1. 概述 本节将介绍两类问题的不同解决方案.其一是通过随机的搜索算法对某一函数的取值进行比较,求取最大/最小值的过程:其二则和积分类似,是使得某一函数被最优化,这一部分内容的代表算法是EM算法.(书 ...
- Android引导指示层的制作 (ViewStub + SharePreference)
引导指示界面是个什么鬼东西?一张图即明了:
- IIS安装与MVC程序部署
最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysq ...
- SDRAM基础知识
SDRAM知识普及 在学习SDRAM之前,必须先了解"SDRAM"这个概念性的东西,并有感性的认识转变到一种理性的认识,所谓理性的认识就是实质性的东西…….不多说,相信你已经迫不急 ...
- Beta版本冲刺———第四天
会议照片: 项目燃尽图: 1.项目进展: 今天解决的进度:新增加了一个撤销按钮,实现对上一步操作的撤销. 仍在进行对排行榜分数变更的实现. 2.每个人每天做的事情 郭怡锋:汇总工作进度,对此总结,进行 ...
- java 枚举的常见使用方法
JDK1.5引入了新的类型-枚举,枚举的出现在日常开发中带来了极大的方便. 常用方法一:常量 JDK1.5之前我们平时定义系统常量,基本都是用public static final ... 出现枚举以 ...
- 提高你的数据库编程效率:Microsoft CLR Via Sql Server
你还在为数据库编程而抓狂吗?那些恶心的脚本拼接,低效的脚本调试的日子将会与我们越来越远啦.现在我们能用支持.NET的语言来开发数据库中的对象,如:存储过程,函数,触发器,集合函数已及复杂的类型.看到这 ...
- jquery-追加元素
一.在元素内部/外部追加元素 append,prepend:添加到子元素 before,after:作为兄弟元素添加 html: <div id="content"> ...