Redis学习笔记——初级
1. Redis是什么、特点、优势
Redis是一个开源的使用C语言编写、开源、支持网络、可基于内存亦可持久化的日志型、高性能的Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String)、哈希(Map)、 列表(list)、集合(sets) 和 有序集合(sorted sets)等类型。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
2. redis安装(Linux)、启动、退出、设置密码、远程连接
2.1 安装redis (链接)
下载redis安装包(如:redis-2.8.17.tar.gz)
- tar -zxvf redis-2.8..tar.gz
- cd redis-2.8.
- make
- sudo make install
2.2 后台启动服务端
- nohup redis-server &
注:redis-server默认启动端口是6379,没有密码
如果不使用默认配置文件,启动时可以加上配置文件
- nohup redis-server ~/soft/redis-2.8./redis.conf &
2.3 启动客户端、验证
- 127.0.0.1:> ping
- PONG
- 127.0.0.1:> set var "hello world"
- OK
- 127.0.0.1:> get var
- "hello world"
2.4 退出
关闭redis-server
- redis-cli shutdown
例子
- $ps -ef | grep redis
- root : pts/ :: redis-server *:
- $sudo redis-cli shutdown
- [] Mar ::29.301 # User requested shutdown...
- [] Mar ::29.301 * Saving the final RDB snapshot before exiting.
- [] Mar ::29.314 * DB saved on disk
- [] Mar ::29.314 # Redis is now ready to exit, bye bye...
- []+ Done sudo redis-server (wd: ~/soft/redis-2.10.)
- (wd now: ~/soft/redis-2.8.)
- $ps -ef | grep redis
- jihite : pts/ :: grep redis
注:如果设置上密码后,单纯的redis-cli是关不掉的,必须加上ip、port、passwd
- sudo redis-cli -h host -p port -a passwd shutdown
退出客户端
- localhost:> QUIT
2.5 设立密码
打开redis.conf找到requirepass,去掉默认,修改
- requirepass yourpassword
验证密码的正确性
- localhost:> 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:> SET var redis
- OK
- localhost:> GET var
- "redis"
- localhost:> DEL var
- (integer)
- localhost:> 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 timestamp EXPIREAT 的作用和 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
例子
- 127.0.0.1:> set var "String type"
- OK
- 127.0.0.1:> get var
- "String type"
说明:利用set给变量var赋值“String type”;利用get获得变量var的值
4.2 Hash(哈希)
- 是一个键值对集合
- 是一个string类型的field和value的映射表,hash特别适合用于存储对象
hset,hget例子
- 127.0.0.1:6379> hget set1 name
- "jihite"
- 127.0.0.1:6379> hget set1 score
- ""
- 127.0.0.1:6379> hset set2 name jihite2
- (integer) 1
- 127.0.0.1:6379> hset set2 score 110
- (integer) 1
- 127.0.0.1:6379> hget set1 name
- "jihite"
hset&hget一次只能往哈希结构里面插入一个键值对,如果插入多个可以用hmset&hmget
hmset, hmget例子
- 127.0.0.1:> HMSET var: name jihite school pku
- OK
- 127.0.0.1:> HGETALL var:
- ) "name"
- ) "jihite"
- ) "school"
- ) "pku"
说明
var:1是键值,每个 hash 可以存储 232 - 1 键值对(40多亿)
HMSET用于建立hash对象,HGETALL用于获取hash对象
hset v.s. hmset操作对比
- 127.0.0.1:6379> hset set5 name1 jihite1 name2 jihite2 name3 jihite3
- (error) ERR wrong number of arguments for 'hset' command
- 127.0.0.1:6379> hmset set5 name1 jihite1 name2 jihite2 name3 jihite3
- OK
- 127.0.0.1:6379> hget set5 name1
- "jihite1"
- 127.0.0.1:6379> hmget set5 name1
- 1) "jihite1"
- 127.0.0.1:6379> hmget set5 name1 name2
- 1) "jihite1"
- 2) "jihite2"
- 127.0.0.1:6379> hget set5 name1 name2
- (error) ERR wrong number of arguments for 'hget' command
4.3 LIST(列表)
例子
- 127.0.0.1:> lpush lvar
- (integer)
- 127.0.0.1:> lpush lvar a
- (integer)
- 127.0.0.1:> lpush lvar ab
- (integer)
- 127.0.0.1:> lrange lvar
- ) "ab"
- ) "a"
- 127.0.0.1:> lrange lvar
- ) "ab"
- ) "a"
- ) ""
- 127.0.0.1:> lrange lvar
- ) ""
说明
lpush往列表的前边插入;lrange后面的数字是范围(闭区间)
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
4.4 Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
例子
- 127.0.0.1:> sadd setvar redis
- (integer)
- 127.0.0.1:> sadd setvar mongodb
- (integer)
- 127.0.0.1:> sadd setvar mongodb
- (integer)
- 127.0.0.1:> sadd setvar rabbitmq
- (integer)
- 127.0.0.1:> smembers setvar
- ) "rabbitmq"
- ) "redis"
- ) "mongodb"
说明
set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0,例子中mongodb第二次插入时,因已经存在,故插入失败。
4.5 zset(sorted sete:有序集合)
zset和set一样也是String类型的集合,且不允许元素重复
zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序
zset的元素是唯一的,但是分数是可以重复的
例子
- 127.0.0.1:> zadd zvar redis
- (integer)
- 127.0.0.1:> zadd zvar redis
- (integer)
- 127.0.0.1:> zadd zvar redis
- (integer)
- 127.0.0.1:>
- 127.0.0.1:> zadd zvar mongo
- (integer)
- 127.0.0.1:> zadd zvar rabbitmq
- (integer)
- 127.0.0.1:>
- 127.0.0.1:> ZRANGEBYSCORE zvar
- ) "rabbitmq"
- ) "mongo"
- ) "redis"
- 127.0.0.1:>
- 127.0.0.1:>
- 127.0.0.1:> zadd zvar - celery
- (integer)
- 127.0.0.1:> ZRANGEBYSCORE zvar
- ) "rabbitmq"
- ) "mongo"
- ) "redis"
- 127.0.0.1:> ZRANGEBYSCORE zvar -
- ) "celery"
- ) "rabbitmq"
- ) "mongo"
- ) "redis"
说明
成功插入返回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:> pfadd jsh redis
- (integer)
- localhost:> pfadd jsh redis
- (integer)
- localhost:> pfadd jsh mongodb
- (integer)
- localhost:> pfadd jsh rabbitmq
- (integer)
- localhost:> pfcount jsh
- (integer)
- localhost:> pfadd jsh2 redis
- (integer)
- localhost:> pfadd jsh2 a
- (integer)
- localhost:> pfcount jsh2
- (integer)
- localhost:> pfmerge jsh jsh2
- OK
- localhost:> pfcount jsh
- (integer)
- localhost:> pfcount jsh2
- (integer)
说明:
- 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:> subscribe redisChat
- Reading messages... (press Ctrl-C to quit)
- ) "subscribe"
- ) "redisChat"
- ) (integer)
打开几个客户端,订阅channel redisChat
- localhost:> psubscribe redisChat
- Reading messages... (press Ctrl-C to quit)
- ) "psubscribe"
- ) "redisChat"
- ) (integer)
然后给channel redisChat发送消息“Hello World”
- localhost:> publish redisChat "Hello World"
- (integer)
客户端会收到消息
- Reading messages... (press Ctrl-C to quit)
- ) "pmessage"
- ) "redisChat"
- ) "redisChat"
- ) "Hello World"
7. Redis事务
事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),执行一个事务中的命令时不会被其他命令打断。
一个事务从开始到结束经过以下三个阶段:
- 开始事务
- 命令入队
- 执行事务
例子
- localhost:> MULTI
- OK
- localhost:> set name jihite
- QUEUED
- localhost:> get name
- QUEUED
- localhost:> sadd language "c++" "python" "java"
- QUEUED
- localhost:> smembers language
- QUEUED
- localhost:> exec
- ) OK
- ) "jihite"
- ) (integer)
- ) ) "java"
- ) "python"
- ) "c++"
说明:事务以MULTI开始,以EXEC结束
8. Redis脚本
Redis 脚本使用 Lua 解释器来执行脚本。执行脚本的常用命令为 EVAL。基本语法
- EVAL script numkeys key [key ...] arg [arg ...]
例子
- localhost:> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" key1 key2 first second
- ) "key1"
- ) "key2"
- ) "first"
- ) "second"
9. 数据备份与恢复
数据备份
- localhost:> save
- OK
改命令会在redis的安装目录中创建文件dump.rdb,并把数据保存在该文件中。
查看redis的安装目录
- localhost:> config get dir
- ) "dir"
- ) "/home/jihite/soft/redis-2.8.17"
数据恢复
只需将备份文件dump.rdb拷贝到redis的安装目录即可。
10. 数据库操作
Redis中,一共有16个数据库,分别是0~15,一般情况下,进入数据库默认编号是0,如果我们要进入指定数据库,可以用select语句
切换到编号为3的数据库
- localhost:> select
- OK
- localhost:[]>
查看数据库中所有的键值
- localhost:[]> set a
- OK
- localhost:[]> set b
- OK
- localhost:[]> keys *
- ) "b"
- ) "a"
返回当前数据库中所有key的数目: dbsize
删除当前数据库中的所有key: flushdb
清空所有数据库中的所有key: flushall
把当前数据库中的key转移到指定数据库:move a aim_db,例:
- localhost:[]> set z sss
- OK
- localhost:[]> move z
- (integer)
- localhost:[]> select
- OK
- localhost:> get z
- "sss"
11. 实际小应用
http://www.aboutyun.com/thread-12613-1-1.html
12. 关闭持久化
数据持久化是Redis不同于其他缓存的一个特性,具有明显的有点。但如不希望持久化数据,只作为普通的缓存用,如memcache
方法:
修改配置文件,改完后重启。
- #save
- #save
- #save
或执行操作命令
- CONFIG SET save ""
执行命令后,无需重启即可生效
Redis学习笔记——初级的更多相关文章
- Redis学习笔记-初级
1.Redis简介 Redis是一个高效缓存内存数据库,开源.免费.key-value格式 相比于其他key-value格式的缓存产品,特点/优势在于: 支持持久化,可以将内存中的数据保存在磁盘中,重 ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...
- 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 先 ...
随机推荐
- 剑指Offer面试题:10.数值的整数次方
一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- 为什么使用Binder而不是其他IPC机制
本文搬运自:Advantages of using Binder for IPC in Android 使用Binder而不是其他(Semaphores , Message Queue, PIPES) ...
- MySQL 子分区
200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...
- Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)
<Windows Azure Platform 系列文章目录> 细心的用户会发现,微软在国外和国内的数据中心建设都是成对的,比如香港数据中心(Asia East)和新加坡的数据中心(Sou ...
- Web Modify The Html Elements According Url Parameters With Jquery
需求说明 根据URL的参数, 来批量的对某些HTML元素做统一的修改. 解决思路 首先, 想办法获得这个URL的参数, 然后遍历对应的HTML元素, 做出对应的修改. 即可. 代码实现 <!DO ...
- Gyp语法规则参考 & 工具的使用
转自:http://www.cnblogs.com/nanvann/p/3913880.html 翻译自 https://code.google.com/p/gyp/wiki/GypLanguageS ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- HTML5应用缓存机制
首先先上一张图: 用360浏览器的用户对这张图应该都是耳熟能详了吧,没错,当网络不通畅时使用360浏览器,便会有这张图弹出来.为什么没有网络还能弹出这一副画面呢?这就关乎HTML5的应用缓存机制了. ...
- SSISDB3:Environments 和 Environment Variables
Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...