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)

  1. tar -zxvf redis-2.8..tar.gz
  2. cd redis-2.8.
  3. make
  4. sudo make install

2.2 后台启动服务端

  1. nohup redis-server &

:redis-server默认启动端口是6379,没有密码

如果不使用默认配置文件,启动时可以加上配置文件

  1. nohup redis-server ~/soft/redis-2.8./redis.conf &

2.3 启动客户端、验证

  1. 127.0.0.1:> ping
  2. PONG
  3.  
  4. 127.0.0.1:> set var "hello world"
  5. OK
  6. 127.0.0.1:> get var
  7. "hello world"

2.4 退出

关闭redis-server

  1. redis-cli shutdown

例子

  1. $ps -ef | grep redis
  2. root : pts/ :: redis-server *:
  3.  
  4. $sudo redis-cli shutdown
  5. [] Mar ::29.301 # User requested shutdown...
  6. [] Mar ::29.301 * Saving the final RDB snapshot before exiting.
  7. [] Mar ::29.314 * DB saved on disk
  8. [] Mar ::29.314 # Redis is now ready to exit, bye bye...
  9. []+ Done sudo redis-server (wd: ~/soft/redis-2.10.)
  10. (wd now: ~/soft/redis-2.8.)
  11.  
  12. $ps -ef | grep redis
  13. jihite : pts/ :: grep redis

:如果设置上密码后,单纯的redis-cli是关不掉的,必须加上ip、port、passwd

  1. sudo redis-cli -h host -p port -a passwd shutdown

退出客户端

  1. localhost:> QUIT

2.5 设立密码

打开redis.conf找到requirepass,去掉默认,修改

  1. requirepass yourpassword

验证密码的正确性

  1. localhost:> auth jihite
  2. OK

2.6 远程连接

需要已经安装redis,可以使用redis-cli命令

  1. redis-cli -h host -p port -a password

2.7 查看redis-server统计信息

  1. INFO

3. Reis key

Redis是key-value的数据库,Redis的键用于管理Redis的键,基本语法是

  1. COMMAND KEY_NAME

例子:

  1. localhost:> SET var redis
  2. OK
  3. localhost:> GET var
  4. "redis"
  5. localhost:> DEL var
  6. (integer)
  7. localhost:> GET var
  8. (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

例子

  1. 127.0.0.1:> set var "String type"
  2. OK
  3. 127.0.0.1:> get var
  4. "String type"

说明:利用set给变量var赋值“String type”;利用get获得变量var的值

4.2 Hash(哈希)

  • 是一个键值对集合
  • 是一个string类型的field和value的映射表,hash特别适合用于存储对象

hset,hget例子

  1. 127.0.0.1:6379> hget set1 name
  2. "jihite"
  3. 127.0.0.1:6379> hget set1 score
  4. ""
  5. 127.0.0.1:6379> hset set2 name jihite2
  6. (integer) 1
  7. 127.0.0.1:6379> hset set2 score 110
  8. (integer) 1
  9. 127.0.0.1:6379> hget set1 name
  10. "jihite"

hset&hget一次只能往哈希结构里面插入一个键值对,如果插入多个可以用hmset&hmget

hmset, hmget例子

  1. 127.0.0.1:> HMSET var: name jihite school pku
  2. OK
  3.  
  4. 127.0.0.1:> HGETALL var:
  5. ) "name"
  6. ) "jihite"
  7. ) "school"
  8. ) "pku"

说明

var:1是键值,每个 hash 可以存储 232 - 1 键值对(40多亿)

HMSET用于建立hash对象,HGETALL用于获取hash对象

hset v.s. hmset操作对比

  1. 127.0.0.1:6379> hset set5 name1 jihite1 name2 jihite2 name3 jihite3
  2. (error) ERR wrong number of arguments for 'hset' command
  3. 127.0.0.1:6379> hmset set5 name1 jihite1 name2 jihite2 name3 jihite3
  4. OK
  5. 127.0.0.1:6379> hget set5 name1
  6. "jihite1"
  7. 127.0.0.1:6379> hmget set5 name1
  8. 1) "jihite1"
  9. 127.0.0.1:6379> hmget set5 name1 name2
  10. 1) "jihite1"
  11. 2) "jihite2"
  12. 127.0.0.1:6379> hget set5 name1 name2
  13. (error) ERR wrong number of arguments for 'hget' command

4.3 LIST(列表)

例子

  1. 127.0.0.1:> lpush lvar
  2. (integer)
  3. 127.0.0.1:> lpush lvar a
  4. (integer)
  5. 127.0.0.1:> lpush lvar ab
  6. (integer)
  7.  
  8. 127.0.0.1:> lrange lvar
  9. ) "ab"
  10. ) "a"
  11. 127.0.0.1:> lrange lvar
  12. ) "ab"
  13. ) "a"
  14. ) ""
  15. 127.0.0.1:> lrange lvar
  16. ) ""

说明

lpush往列表的前边插入;lrange后面的数字是范围(闭区间)

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

4.4 Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

例子

  1. 127.0.0.1:> sadd setvar redis
  2. (integer)
  3. 127.0.0.1:> sadd setvar mongodb
  4. (integer)
  5. 127.0.0.1:> sadd setvar mongodb
  6. (integer)
  7. 127.0.0.1:> sadd setvar rabbitmq
  8. (integer)
  9. 127.0.0.1:> smembers setvar
  10. ) "rabbitmq"
  11. ) "redis"
  12. ) "mongodb"

说明

set往集合中插入元素,smembers列举出集合中的元素

成功插入返回1;错误插入返回0,例子中mongodb第二次插入时,因已经存在,故插入失败。

4.5 zset(sorted sete:有序集合)

zset和set一样也是String类型的集合,且不允许元素重复

zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序

zset的元素是唯一的,但是分数是可以重复的

例子

  1. 127.0.0.1:> zadd zvar redis
  2. (integer)
  3. 127.0.0.1:> zadd zvar redis
  4. (integer)
  5. 127.0.0.1:> zadd zvar redis
  6. (integer)
  7. 127.0.0.1:>
  8. 127.0.0.1:> zadd zvar mongo
  9. (integer)
  10. 127.0.0.1:> zadd zvar rabbitmq
  11. (integer)
  12. 127.0.0.1:>
  13. 127.0.0.1:> ZRANGEBYSCORE zvar
  14. ) "rabbitmq"
  15. ) "mongo"
  16. ) "redis"
  17. 127.0.0.1:>
  18. 127.0.0.1:>
  19. 127.0.0.1:> zadd zvar - celery
  20. (integer)
  21. 127.0.0.1:> ZRANGEBYSCORE zvar
  22. ) "rabbitmq"
  23. ) "mongo"
  24. ) "redis"
  25. 127.0.0.1:> ZRANGEBYSCORE zvar -
  26. ) "celery"
  27. ) "rabbitmq"
  28. ) "mongo"
  29. ) "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.

例子

  1. localhost:> pfadd jsh redis
  2. (integer)
  3. localhost:> pfadd jsh redis
  4. (integer)
  5. localhost:> pfadd jsh mongodb
  6. (integer)
  7. localhost:> pfadd jsh rabbitmq
  8. (integer)
  9. localhost:> pfcount jsh
  10. (integer)
  11. localhost:> pfadd jsh2 redis
  12. (integer)
  13. localhost:> pfadd jsh2 a
  14. (integer)
  15. localhost:> pfcount jsh2
  16. (integer)
  17.  
  18. localhost:> pfmerge jsh jsh2
  19. OK
  20. localhost:> pfcount jsh
  21. (integer)
  22. localhost:> pfcount jsh2
  23. (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

  1. localhost:> subscribe redisChat
  2. Reading messages... (press Ctrl-C to quit)
  3. ) "subscribe"
  4. ) "redisChat"
  5. ) (integer)

打开几个客户端,订阅channel redisChat

  1. localhost:> psubscribe redisChat
  2. Reading messages... (press Ctrl-C to quit)
  3. ) "psubscribe"
  4. ) "redisChat"
  5. ) (integer)

然后给channel redisChat发送消息“Hello World”

  1. localhost:> publish redisChat "Hello World"
  2. (integer)

客户端会收到消息

  1. Reading messages... (press Ctrl-C to quit)
  2. ) "pmessage"
  3. ) "redisChat"
  4. ) "redisChat"
  5. ) "Hello World"

7. Redis事务

事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),执行一个事务中的命令时不会被其他命令打断。

一个事务从开始到结束经过以下三个阶段:

  • 开始事务
  • 命令入队
  • 执行事务

例子

  1. localhost:> MULTI
  2. OK
  3. localhost:> set name jihite
  4. QUEUED
  5. localhost:> get name
  6. QUEUED
  7. localhost:> sadd language "c++" "python" "java"
  8. QUEUED
  9. localhost:> smembers language
  10. QUEUED
  11. localhost:> exec
  12. ) OK
  13. ) "jihite"
  14. ) (integer)
  15. ) ) "java"
  16. ) "python"
  17. ) "c++"

说明:事务以MULTI开始,以EXEC结束

8. Redis脚本

Redis 脚本使用 Lua 解释器来执行脚本。执行脚本的常用命令为 EVAL。基本语法

  1. EVAL script numkeys key [key ...] arg [arg ...]

例子

  1. localhost:> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" key1 key2 first second
  2. ) "key1"
  3. ) "key2"
  4. ) "first"
  5. ) "second"

9. 数据备份与恢复

数据备份

  1. localhost:> save
  2. OK

改命令会在redis的安装目录中创建文件dump.rdb,并把数据保存在该文件中。

查看redis的安装目录

  1. localhost:> config get dir
  2. ) "dir"
  3. ) "/home/jihite/soft/redis-2.8.17"

数据恢复

只需将备份文件dump.rdb拷贝到redis的安装目录即可。

10. 数据库操作

Redis中,一共有16个数据库,分别是0~15,一般情况下,进入数据库默认编号是0,如果我们要进入指定数据库,可以用select语句

切换到编号为3的数据库

  1. localhost:> select
  2. OK
  3. localhost:[]>

查看数据库中所有的键值

  1. localhost:[]> set a
  2. OK
  3. localhost:[]> set b
  4. OK
  5. localhost:[]> keys *
  6. ) "b"
  7. ) "a"

返回当前数据库中所有key的数目:  dbsize

删除当前数据库中的所有key:   flushdb

清空所有数据库中的所有key:   flushall

把当前数据库中的key转移到指定数据库:move a aim_db,例:

  1. localhost:[]> set z sss
  2. OK
  3. localhost:[]> move z
  4. (integer)
  5. localhost:[]> select
  6. OK
  7. localhost:> get z
  8. "sss"

11. 实际小应用

http://www.aboutyun.com/thread-12613-1-1.html

12. 关闭持久化

数据持久化是Redis不同于其他缓存的一个特性,具有明显的有点。但如不希望持久化数据,只作为普通的缓存用,如memcache

方法:

修改配置文件,改完后重启。

  1. #save
  2. #save
  3. #save

或执行操作命令

  1. CONFIG SET save ""

执行命令后,无需重启即可生效

Redis学习笔记——初级的更多相关文章

  1. Redis学习笔记-初级

    1.Redis简介 Redis是一个高效缓存内存数据库,开源.免费.key-value格式 相比于其他key-value格式的缓存产品,特点/优势在于: 支持持久化,可以将内存中的数据保存在磁盘中,重 ...

  2. redis学习笔记(详细)——高级篇

    redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...

  3. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  4. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  5. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  6. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  7. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  8. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  9. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

随机推荐

  1. 剑指Offer面试题:10.数值的整数次方

    一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...

  2. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  3. 为什么使用Binder而不是其他IPC机制

    本文搬运自:Advantages of using Binder for IPC in Android 使用Binder而不是其他(Semaphores , Message Queue, PIPES) ...

  4. MySQL 子分区

    200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...

  5. Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)

    <Windows Azure Platform 系列文章目录> 细心的用户会发现,微软在国外和国内的数据中心建设都是成对的,比如香港数据中心(Asia East)和新加坡的数据中心(Sou ...

  6. Web Modify The Html Elements According Url Parameters With Jquery

    需求说明 根据URL的参数, 来批量的对某些HTML元素做统一的修改. 解决思路 首先, 想办法获得这个URL的参数, 然后遍历对应的HTML元素, 做出对应的修改. 即可. 代码实现 <!DO ...

  7. Gyp语法规则参考 & 工具的使用

    转自:http://www.cnblogs.com/nanvann/p/3913880.html 翻译自 https://code.google.com/p/gyp/wiki/GypLanguageS ...

  8. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  9. HTML5应用缓存机制

    首先先上一张图: 用360浏览器的用户对这张图应该都是耳熟能详了吧,没错,当网络不通畅时使用360浏览器,便会有这张图弹出来.为什么没有网络还能弹出这一副画面呢?这就关乎HTML5的应用缓存机制了. ...

  10. SSISDB3:Environments 和 Environment Variables

    Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...