Redis 基础应用

Redis 基础应用(一)html

==============================================================================程序员

概述:redis

  • Redis的相关介绍,功能,优点及于其余key-value数据库的对比;算法

  • Redis的安装及程序环境;mongodb

  • 命令行客户端命令数据库

  • Redis 的数据结构
    vim

==============================================================================centos

Redis简介

 1.简介缓存

Redisbash

  • REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的 key-value存储系统。

  • Redis是一个开源的使用ANSI C语言编写、遵照BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

  • 它一般被称为数据结构服务器,由于值(value)能够是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

REmote DIctionary Server(Redis)

  • 内存存储;

  • 持久化;

  • 主从;

  • Cluster

Redis 与其余 key - value 缓存产品有如下三个特色:

  • Redis支持数据的持久化,能够将内存中的数据保存在磁盘中,重启的时候能够再次加载进行使用。

  • Redis不只仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  • Redis支持数据的备份,即master-slave模式的数据备份。 

 2.功能

支持的功能以下:

数据结构服务器:

  • 值(value)能够是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

单进程

  • CPU 并不是瓶颈

持久化机制

  • snapshoting

  • AOF

Replication

 主从:

  • 主:rw

  • 从:read-only

 3.优点

优点

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操做

  • 原子 – Redis的全部操做都是原子性的,同时Redis还支持对几个操做全并后的原子性执行。

  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过时等等特性。

 4.Redis与其余key-value存储有什么不一样

区别:

  • Redis有着更为复杂的数据结构而且提供对他们的原子性操做,这是一个不一样于其余数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

  • Redis运行在内存中可是能够持久化到磁盘,因此在对不一样数据集进行高速读写时须要权衡内存,由于数据量不能大于硬件内存。在内存数据库方面的另外一个优势是,相比在磁盘上相同的复杂的数据结构,在内存中操做起来很是简单,这样Redis能够作不少内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,由于他们并不须要进行随机访问。

和memcached的区别

  • Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。memcache仅支持字符串型值(流式化数据)

  • Redis为单线程,Memcached为多线程,但性能上至关;

  • Redis支持数据的备份,即master-slave模式的数据备份。

  • Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。(在Redis中,并非全部的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别)

  • 应用场景不同:Redis出来做为NoSQL数据库使用外,还能用作消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。

redis、memcache、mongoDB 对比
从如下几个维度,对redis、memcache、mongoDB 作了对比,欢迎拍砖
性能

  • 都比较高,性能对咱们来讲应该都不是瓶颈

  • 整体来说,TPS方面redis和memcache差很少,要大于mongodb

操做的便利性

  • memcache数据结构单一

  • redis丰富一些,数据操做方面,redis更好一些,较少的网络IO次数

  • mongodb支持丰富的数据表达,索引,最相似关系型数据库,支持的查询语言很是丰富

内存空间的大小和数据量的大小

  • redis在2.0版本后增长了本身的VM特性,突破物理内存的限制;能够对key value设置过时时间(相似memcache)

  • memcache能够修改最大可用内存,采用LRU算法

  • mongoDB适合大数据量的存储,依赖操做系统VM作内存管理,吃内存也比较厉害,服务不要和别的服务在一块儿

可用性(单点问题)
对于单点问题

  • redis,依赖客户端来实现分布式读写;主从复制时,每次从节点从新链接主节点都要依赖整个快照,无增量复制,因性能和效率问题,
    因此单点问题比较复杂;不支持自动sharding,须要依赖程序设定一致hash 机制。
    一种替代方案是,不用redis自己的复制机制,采用本身作主动复制(多份存储),或者改为增量复制的方式(须要本身实现),一致性问题和性能的权衡

  • Memcache自己没有数据冗余机制,也不必;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引发的抖动问题。

  • mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。

可靠性(持久化)
对于数据持久化和数据恢复,

  • redis支持(快照、AOF):依赖快照进行持久化,aof加强了可靠性的同时,对性能有所影响

  • memcache不支持,一般用在作缓存,提高性能;

  • MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性

数据一致性(事务支持)

  • Memcache 在并发场景下,用cas保证一致性

  • redis事务支持比较弱,只能保证事务中的每一个操做连续执行

  • mongoDB不支持事务

数据分析

  • mongoDB内置了数据分析的功能(mapreduce),其余不支持

应用场景

  • redis:数据量较小的更性能操做和运算上

  • memcache:用于在动态系统中减小数据库负载,提高性能;作缓存,提升性能(适合读多写少,对于数据量比较大,能够采用sharding)

  • MongoDB:主要解决海量数据的访问效率问题

Redis安装及数据结构

 1.安装及程序环境

安装方法:

  • 编译安装

  • rpm包安装

程序环境

配置文件

  • /etc/redis.conf

  • /etc/redis-sentinel.conf

主程序

  • /usr/bin/redis-server

  • /usr/bin/redis-sentinel

  • 监听端口:6379/tcp

命令行客户端

  • /usr/bin/redis-cli

演示:

1.安装程序包

# 配置好epel仓库
[root@centos7 ~]# yum install redis

2.程序环境以下:

[root@centos7 ~]# rpm -ql redis
/etc/logrotate.d/redis
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/systemd/system/redis-sentinel.service.d
/etc/systemd/system/redis-sentinel.service.d/limit.conf
/etc/systemd/system/redis.service.d
/etc/systemd/system/redis.service.d/limit.conf
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
/usr/bin/redis-shutdown
/usr/lib/systemd/system/redis-sentinel.service
/usr/lib/systemd/system/redis.service
/usr/lib/tmpfiles.d/redis.conf
/usr/share/doc/redis-3.2.3
/usr/share/doc/redis-3.2.3/00-RELEASENOTES
/usr/share/doc/redis-3.2.3/BUGS
/usr/share/doc/redis-3.2.3/CONTRIBUTING
/usr/share/doc/redis-3.2.3/MANIFESTO
/usr/share/doc/redis-3.2.3/README.md
/usr/share/licenses/redis-3.2.3
/usr/share/licenses/redis-3.2.3/COPYING
/var/lib/redis
/var/log/redis
/var/run/redis

3.配置文件/etc/redis.conf 以下:

# 备份
[root@centos7 ~]# cp /etc/redis.conf{,.bak}
 
[root@centos7 ~]# grep "^##" /etc/redis.conf
################################## INCLUDES ###################################
################################## NETWORK #####################################
################################# GENERAL #####################################
################################ SNAPSHOTTING  ################################
################################# REPLICATION #################################
################################## SECURITY ###################################
################################### LIMITS ####################################
############################## APPEND ONLY MODE ###############################
################################ LUA SCRIPTING  ###############################
################################ REDIS CLUSTER  ###############################
################################## SLOW LOG ###################################
################################ LATENCY MONITOR ##############################
############################# EVENT NOTIFICATION ##############################
############################### ADVANCED CONFIG ###############################

[root@centos7 ~]# vim /etc/redis.conf
 bind 0.0.0.0  # 修改绑定的端口
 
# 启动 redis,查看坚挺的端口 6379
[root@centos7 ~]# systemctl start redis
[root@centos7 ~]# ss -tnlp |grep "redis"
LISTEN     0      128          *:6379                     *:*                   users:(("redis-server",pid=3840,fd=4))

 3.命令行客户端命令

redis-cli

语法:

  • redis-cli [OPTIONS] [cmd [arg [arg ...]]]

经常使用选项:

  • -h <hostname>      Server hostname (default: 127.0.0.1).   //主机地址

  • -p <port>          Server port (default: 6379).                        //端口

  • -a <password>      Password to use when connecting to the server.    //密码

演示:

1.本地链接,直接运行 redis-cli 命令便可

[root@centos7 ~]# redis-cli
127.0.0.1:6379> ping
PONG

2.远程链接,指明要链接的主机,端口和密码便可

[root@centos7 ~]# redis-cli -h 192.168.1.112
192.168.1.112:6379> ping
PONG

192.168.1.112:6379> help  # 获取帮助
redis-cli 3.2.3
To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

To set redis-cli perferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc

Redis:k/v

 1.k/v 和 group

k/v

  • key:直接ASCII字符串;

  • value(数据结构):string,lists,hashes,set,sored sets,bltmaps,hyperloglog

group

  • @string,@generic,@list  @...

 2.string(字符串)

做用:

  • Redis 字符串数据类型的相关命令用于管理 redis 字符串值;

基本语法:

  • 127.0.0.1:6379>COMMAND  KEY_NAME

演示:

192.168.1.112:6379> SET count 1
OK
192.168.1.112:6379> GET count
"1"
192.168.1.112:6379> INCR count
(integer) 2
192.168.1.112:6379> INCR count
(integer) 3
192.168.1.112:6379> INCR count
(integer) 4
192.168.1.112:6379> INCR count
(integer) 5
192.168.1.112:6379> DECR count
(integer) 4
192.168.1.112:6379> DECR count
(integer) 3
192.168.1.112:6379> DECR count
(integer) 2
192.168.1.112:6379> DECR count
(integer) 1

下表列出了经常使用的 redis 字符串命令:

序号 命令及描述
1 SET key value 
设置指定 key 的值
2 GET key 
获取指定 key 的值。
3 GETRANGE key start end 
返回 key 中字符串值的子字符
4 GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5 GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6 MGET key1 [key2..]
获取全部(一个或多个)给定 key 的值。
7 SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8 SETEX key seconds value
将值 value 关联到 key ,并将 key 的过时时间设为 seconds (以秒为单位)。
9 SETNX key value
只有在 key 不存在时设置 key 的值。
10 SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11 STRLEN key
返回 key 所储存的字符串值的长度。
12 MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13 MSETNX key value [key value ...] 
同时设置一个或多个 key-value 对,当且仅当全部给定 key 都不存在。
14 PSETEX key milliseconds value
这个命令和 SETEX 命令类似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15 INCR key
将 key 中储存的数字值增一。
16 INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17 INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18 DECR key
将 key 中储存的数字值减一。
19 DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
20 APPEND key value
若是 key 已经存在而且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

 3.list(列表)

做用

  • Redis列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素导列表的头部(左边)或者尾部(右边)

  • 一个列表最多能够包含 232 - 1 个元素 (4294967295, 每一个列表超过40亿个元素)。

演示:

192.168.1.112:6379> RPUSH mylist "mon"
(integer) 1
192.168.1.112:6379> LINDEX mylist 0
"mon"
192.168.1.112:6379> RPUSH mylist "tun"
(integer) 2
192.168.1.112:6379> LPUSH mylist "sun"
(integer) 3
192.168.1.112:6379> LINDEX mylist 0
"sun"
192.168.1.112:6379> LINDEX mylist 0
"sun"
192.168.1.112:6379> LINDEX mylist 1
"mon"
192.168.1.112:6379> LINDEX mylist 2
"tun"
192.168.1.112:6379> RPOP mylist
"tun"
192.168.1.112:6379> LLEN mylist
(integer) 2

下表列出了列表相关的基本命令:

序号 命令及描述
1 BLPOP key1 [key2 ] timeout 
移出并获取列表的第一个元素, 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2 BRPOP key1 [key2 ] timeout 
移出并获取列表的最后一个元素, 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3 BRPOPLPUSH source destination timeout 
从列表中弹出一个值,将弹出的元素插入到另一个列表中并返回它; 若是列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4 LINDEX key index 
经过索引获取列表中的元素
5 LINSERT key BEFORE|AFTER pivot value 
在列表的元素前或者后插入元素
6 LLEN key 
获取列表长度
7 LPOP key 
移出并获取列表的第一个元素
8 LPUSH key value1 [value2] 
将一个或多个值插入到列表头部
9 LPUSHX key value 
将一个或多个值插入到已存在的列表头部
10 LRANGE key start stop 
获取列表指定范围内的元素
11 LREM key count value 
移除列表元素
12 LSET key index value 
经过索引设置列表元素的值
13 LTRIM key start stop 
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间以内的元素都将被删除。
14 RPOP key 
移除并获取列表最后一个元素
15 RPOPLPUSH source destination 
移除列表的最后一个元素,并将该元素添加到另外一个列表并返回
16 RPUSH key value1 [value2] 
在列表中添加一个或多个值
17 RPUSHX key value 
为已存在的列表添加值

 4.set(集合)

做用:

  • Redis的Set是string类型的无序集合。集合成员是惟一的,这就意味着集合中不能出现重复的数据。

  • Redis 中 集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是O(1)。

  • 集合中最大的成员数为 232 - 1 (4294967295, 每一个集合可存储40多亿个成员)。

演示:

192.168.1.112:6379> SADD s1 'a' 'b' 'c'
(integer) 3
192.168.1.112:6379> SMEMBERS s1
1) "c"
2) "b"
3) "a"
192.168.1.112:6379> SISMEMBER s1 'a'
(integer) 1
192.168.1.112:6379> SISMEMBER s1 'c'
(integer) 1
192.168.1.112:6379> SISMEMBER s1 'd'
(integer) 0
192.168.1.112:6379> SADD s2 'a' 'c' 'd' 'f'
(integer) 4
192.168.1.112:6379> SINTER s1 s2
1) "c"
2) "a"
192.168.1.112:6379> SUNION s1 s2
1) "f"
2) "a"
3) "b"
4) "d"
5) "c"

下表列出了 Redis 集合基本命令:

序号 命令及描述
1 SADD key member1 [member2] 
向集合添加一个或多个成员
2 SCARD key 
获取集合的成员数
3 SDIFF key1 [key2] 
返回给定全部集合的差集
4 SDIFFSTORE destination key1 [key2] 
返回给定全部集合的差集并存储在 destination 中
5 SINTER key1 [key2] 
返回给定全部集合的交集
6 SINTERSTORE destination key1 [key2] 
返回给定全部集合的交集并存储在 destination 中
7 SISMEMBER key member 
判断 member 元素是不是集合 key 的成员
8 SMEMBERS key 
返回集合中的全部成员
9 SMOVE source destination member 
将 member 元素从 source 集合移动到 destination 集合
10 SPOP key 
移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count] 
返回集合中一个或多个随机数
12 SREM key member1 [member2] 
移除集合中一个或多个成员
13 SUNION key1 [key2] 
返回全部给定集合的并集
14 SUNIONSTORE destination key1 [key2] 
全部给定集合的并集存储在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 
迭代集合中的元素

 5.hash(哈希)

做用:

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

  • Redis 中每一个 hash 能够存储 232 - 1 键值对(40多亿)。

演示:

192.168.1.112:6379> HSET h1 name taotao
(integer) 1
192.168.1.112:6379> HSET h1 age 25
(integer) 1
192.168.1.112:6379> HGETALL h1
1) "name"
2) "taotao"
3) "age"
4) "25"
192.168.1.112:6379> HKEYS h1
1) "name"
2) "age"
192.168.1.112:6379> HVALS h1
1) "taotao"
2) "25"
192.168.1.112:6379> HGET h1 name
"taotao"
192.168.1.112:6379> HGET h1 age
"25"

下表列出了 redis hash 基本的相关命令:

序号 命令及描述
1 HDEL key field2 [field2] 
删除一个或多个哈希表字段
2 HEXISTS key field 
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 
获取存储在哈希表中指定字段的值。
4 HGETALL key 
获取在哈希表中指定 key 的全部字段和值
5 HINCRBY key field increment 
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key 
获取全部哈希表中的字段
8 HLEN key 
获取哈希表中字段的数量
9 HMGET key field1 [field2] 
获取全部给定字段的值
10 HMSET key field1 value1 [field2 value2 ] 
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value 
将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value 
只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key 
获取哈希表中全部值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 
迭代哈希表中的键值对。

 6.sorted set(有序集合)

做用:

  • Redis 有序集合和集合同样也是string类型元素的集合,且不容许重复的成员。

  • 不一样的是每一个元素都会关联一个double类型的分数。redis正是经过分数来为集合中的成员进行从小到大的排序。

  • 有序集合的成员是惟一的,但分数(score)却能够重复。

  • 集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每一个集合可存储40多亿个成员)。

下表列出了 redis 有序集合的基本命令:

序号 命令及描述
1 ZADD key score1 member1 [score2 member2] 
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key 
获取有序集合的成员数
3 ZCOUNT key min max 
计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member 
有序集合中对指定成员的分数加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...] 
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6 ZLEXCOUNT key min max 
在有序集合中计算指定字典区间内成员数量
7 ZRANGE key start stop [WITHSCORES] 
经过索引区间返回有序集合成指定区间内的成员
8 ZRANGEBYLEX key min max [LIMIT offset count] 
经过字典区间返回有序集合的成员
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
经过分数返回有序集合指定区间内的成员
10 ZRANK key member 
返回有序集合中指定成员的索引
11 ZREM key member [member ...] 
移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max 
移除有序集合中给定的字典区间的全部成员
13 ZREMRANGEBYRANK key start stop 
移除有序集合中给定的排名区间的全部成员
14 ZREMRANGEBYSCORE key min max 
移除有序集合中给定的分数区间的全部成员
15 ZREVRANGE key start stop [WITHSCORES] 
返回有序集中指定区间内的成员,经过索引,分数从高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 
返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member 
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member 
返回有序集中,成员的分数值
19 ZUNIONSTORE destination numkeys key [key ...] 
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
相关文章
相关标签/搜索