专题篇一:数据库缓存服务——(Redis的yum安装,编译安装,持久化RDB和AOF,五种基本数据类型string,hash,list,set,sorted set)

数据库缓存服务——Redis

一,缓存服务器简介

许多Web应用都将数据保存到 RDBMS关系数据库管理系统中,应用服务器
从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,
就会出现关系型数据库RDBMS的负担加重、数据库响应恶化、 网站显示
延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,
通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用
的速度、 提高可扩展性。为弥补关系型数据库的不足,各种各样的
NoSQL非关系型数据库应运而生。

1,NOSQL(非关系型数据库)

产品: redis,memcached,mongodb,
名词解释:非关系型数据库
以键值对的方式存储数据---(Key-Value)的形式
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
- 缓存服务器作用: 加快访问速度,缓解数据库压力
缺点:
- 没有标准化
- 有限的查询功能(到目前为止)

注意:
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法
的集合,可以是文档或者键值对等

2,关系型数据库

产品:SQL Server   Oracle(收费)   mysql(免费)
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

二,redis简介

1,redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存
也可持久化的Key-Value数据库。
2,内存存储是临时存储,持续化存储把数据从内存写入到磁盘,实现数据
的持久化存储
3,redis的官网:redis.io 注:域名后缀io属于国家域名

4,软件获取帮助:
• 官方网站:https://redis.io
• 官方各版本下载地址:http://download.redis.io/releases/
• Redis 中文命令参考:http://redisdoc.com
• 中文网站1:http://redis.cn
• 中文网站2:http://www.redis.net.cn

5,Redis的特点
-丰富的数据结构   list,set,hash等数据结构的存储
-支持持久化
-支持事务原子性 “一个完整的动作,要么全部执行,要么什么也没有做”。
-支持主从支持高可用,支持分布式分片集群

3,redis的yum安装部署

1,安装redis的仓库:
[root@xingdian ~]# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y
2,指定源安装redis(默认安装的是最新的版本7)
[root@xingdian ~]# yum --enablerepo=remi install redis -y
3,启动redis并做开机启动:
[root@xingdian ~]# systemctl start redis
[root@xingdian ~]# systemctl enable redis
4,设置redis.conf,允许远程登录:
[root@xingdian ~]# vim /etc/redis.conf
bind 127.0.0.1 改为 bind 0.0.0.0 (可选) 或者注释
5,登陆redis
[root@xingdian ~]# systemctl restart redis
[root@xingdian ~]# redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name xingdian
OK
127.0.0.1:6379> get name
"xingdian"
127.0.0.1:6379> exit

4,redis的编译安装部署

下载源码包:
[root@xingdian ~]# wget http://download.redis.io/releases/redis-6.0.7.tar.gz
解压到指定目录下:
[root@xingdian ~]# tar xf redis-6.0.7.tar.gz -C /usr/local/
切换到解压目录下进行编译安装:
[root@xingdian ~]# cd /usr/local/redis-6.0.7
[root@xingdian ~]# make MALLOC=lib 
虚拟机如果报错:
cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
cc: error: ../deps/lua/src/liblua.a: No such file or directory
解决方案:
[root@gitlab redis]# cd deps/
[root@gitlab deps]# make lua hiredis linenoise
然后在继续make
[root@xingdian ~]# cd /usr/local/redis-6.0.7/src && make test
注意:6版本的在执行make all 的时候会报以下的错误:
make: *** [server.o] Error 1
解决方案:更新gcc版本
[root@xingdian ~]# yum -y install centos-release-scl
[root@xingdian ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@xingdian ~]# scl enable devtoolset-9 bash
[root@xingdian ~]# echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
[root@xingdian ~]# gcc -v
报错解决方案
[root@xingdian-server-11 src]# make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
[root@xingdian-server-11 src]# yum -y install tcl
解决完后继续执行make all
后台运行:
[root@xingdian ~]# ./redis-server &
查看版本信息:
[root@xingdian ~]# ./redis-cli --version
redis-cli 6.0.7
[root@xingdian ~]# ./redis-server --version
Redis server v=6.0.7 sha=00000000:0 malloc=libc bits=64 build=924e64be34b50747
[root@xingdian ~]# ss -lntp |grep redis
LISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=5124,fd=6))
LISTEN     0      128        ::1:6379                    :::*                   users:(("redis-server",pid=5124,fd=7))
关闭redis进程需要使用kill进行管理
[root@xingdian ~]#pkill  redis 

5,扩展:设置系统进程启动 Redis

先编辑配置文件,然后在把配置文件拷贝到/etc/redis下
vim /usr/local/redis-6.0.7/redis.conf 
bind 127.0.0.1   # 修改为0.0.0.0注释掉,否则数据库只有本机能够使用或者
daemonize yes     # 将no改为yes,使数据库能够以后台守护进程运行
protected-mode no         # 把保护模式的yes改为no,否则会阻止远程访问 
#requirepass redis       # 打开注释,是设置密码的,这个了解一下,不设置 

[root@xingdian-server-2 src]# mkdir /etc/redis          
[root@xingdian-server-2 src]# cp /usr/local/redis-6.0.7/redis.conf  /etc/redis

开机自启动,将redis的启动脚本复制一份放到/etc/init.d目录下
[root@xingdian-server-2 src]# cp /usr/local/redis-6.0.7/utils/redis_init_script  /etc/init.d/redis
[root@xingdian-server-2 src]# vim /etc/init.d/redis 
REDISPORT=6379
EXEC=/usr/local/redis-6.0.7/src/redis-server   #启动文件路径
CLIEXEC=/usr/local/redis-6.0.7/src/redis-cli   #启动客户端文件路径
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis.conf"              #取消变量,写配置文件的路径
[root@xingdian-server-2 src]# systemctl daemon-reload   加载一下
[root@xingdian-server-2 src]# systemctl start redis
[root@xingdian-server-2 src]# ps aux | grep redis 

补充:如果配置文件的密码设置开启,如下操作
软链接
[root@redis-2 src]# ln -s  /usr/local/redis/src/redis-cli  /usr/bin/redis-cli
[root@redis-2 src]# redis-cli      无密码登录
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> exit
[root@redis-2 src]# redis-cli -a redis     带密码登录
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG

6,Redis使用

一,redis的相关工具
./redis-benchmark     用于进行redis性能测试的工具
./redis-check-rdb     用于修复出问题的dump.rdb文件
./redis-cli           redis的客户端(重点)
./redis-server        redis的服务端(重点)
./redis-check-aof     用于修复出问题的AOF文件
./redis-sentinel      用于集群管理(重点)

二,redis配置文件
1、是否后台运行
daemonize no/yes
2、默认端口
port 6379
3、AOF 日志开关是否打开
appendonly no/yes
4、日志文件位置
logfile /var/log/redis.log
5、RDB 持久化数据文件
dbfilename dump.rdb
6、指定IP进行监听
bind 10.0.0.51 ip2 ip3 ip4
7、禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
8、增加requirepass {password}
requirepass root9、在redis-cli中使用

7,RDB和AOF数据持久化介绍

开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复(redis是把数
据放在缓存中,持久化就是把数据存储在磁盘中)

redis持久化 – 两种方式
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF
(Append Only File仅追加文件)。
一,RDB(Redis DataBase):是根据不同的时间点,将redis存储的数据生成快
照并存储到磁盘等介质上;(根据不同时间点,快照方式存入磁盘,完整性比较差)
特点:
1.周期性
2.不影响数据写入:是RDB会启动子进程,备份所有数据。当前进程,继续提供
数据的读写。当备份完成,才替换老的备份文件。
3.高效       #一次性还原所有数据
4.完整性较差 #故障点到上一次备份,之间的数据无法恢复。

二,AOF(Append Only File)则是换了一个角度来实现持久化,那就是将redis
执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前
到后再重复执行一遍,就可以实现数据恢复了。
特点:(AOF记录redis所有的指令,实时性,完整性好,体积大)
1.实时性
2.完整性较好
3.体积大  #记录数据的指令,删除数据的指令都会被记录下来。

Redis支持RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,
则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis
将变成一个纯内存数据库,就像memcache一样。
Memcache(只支持内存服务,不支持持久化)        

如何选择方式?
1,因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,
2,redis持久化 – 如何选择RDB和AOF
对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠
的持久化方案。
        写入速度快 ------------AOF
        写入速度慢 ------------RDB

8,RDB和AOF数据持久化配置

1,关闭持久化RDB
[root@redis-master redis]# vim redis.conf
#save ""  RDB默认是开启的,取消注释就是关闭
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1 
save 300 10
save 60 10000


2、客户端使用命令进行持久化save存储:
方式一
[root@redis-master src]# ./redis-cli -h 192.168.246.202 -p 6379 save   #前台进行存储
OK
方式二
./redis-cli -h ip -p port bgsave  #后台进行存储

注意:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步
数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,
可能会严重影响性能。

3.AOF 持久化配置
appendonly yes/no     是否打开aof日志功能
appendfsync always    每1个命令,都立即同步到aof
appendfsync everysec  每秒写1次
appendfsync no  写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入
到aof

高级参数:
no-appendfsync-on-rewrite yes/no 正在导出rdb快照的过程中,要不要停止
同步 aof
auto-aof-rewrite-percentage 100  aof文件大小比起上次重写时的大小,
增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
auto-aof-rewrite-min-size 64mb aof文件,至少超过64M时,重写

9,RDB到AOF切换

RDB 到 AOF 切换
1、为最新的 dump.rdb 文件创建一个备份。
2、将备份放到一个远端另外一台服务器上。
3、执行以下两条命令:
redis-cli config set appendonly yes
redis-cli config set save “”
vim redis.conf
appendonly yes  #打开aof日志功能
4、确保写命令会被正确地追加到 AOF 文件的末尾。
注意:
执行的第一条命令开启了AOF 功能:Redis会阻塞直到初始AOF文件创建
完成为止,之后 Redis 会继续处理命令请求,并开始将写入命令追加到AOF
文件末尾。
执行的第二条命令用于关闭 RDB 功能。这一步是可选的,如果你愿意的话,也可以
同时使用 RDB 和 AOF 这两种持久化功能。
别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后,之前通
过 CONFIG SET 设置的配置不会生效, 程序会按原来的配置来启动服务器。

10,数据恢复实验

数据恢复实验:
两台yum安装的redis服务器
1.第一台redis产生数据(启动rdb【默认开启,如果关闭,开启它】)
利用redis-cli 在服务上产生数据
[root@redis-1 ~]# redis-cli
127.0.0.1:6379>set name chenglong
127.0.0.1:6379>set class cloud
127.0.0.1:6379>save
2.找到旧机器的rdb文件(1.看配置文件;2.在redis-cli使用:config get dir)
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> CONFIG get dir
1) "dir"
2) "/var/lib/redis"
[root@redis-1 ~]# ls /var/lib/redis/
dump.rdb
3.把rdb文件拷贝新机器2中,前提机器2处于redis关闭
[root@redis-2 ~]#systemctl stop redis
[root@redis-1 ~]#scp /var/lib/redis/*  192.168.222.133:/var/lib/redis/

4.启动新机器的redis
[root@redis-2 ~]#systemctl start redis
5.利用redis-cli进入到redis,使用get获取对应key的值,能够获取到在旧机器
上的数据,说明恢复成功。
[root@redis-2 ~]#redis-cli
127.0.0.1:6379>get name
"chenglong"

三,redis管理实战

1.Redis 基本数据类型

类型	
1,String字符串:	
Redis 字符串数据类型的相关命令用于管理 redis 字符串值

2,Hash  哈希	
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于
存储对象。Redis 中每个 hash 可以存储 (2的32次方)2^32 - 1 键值对
(40多亿)。

3,List  列表	
Redis列表是简单的字符串列表,按照插入顺序排序。你可以
添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含
 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)4,Set   集合	
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

5,Sorted set  有序集合	
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

2.Redis 命令介绍help

127.0.0.1:6379> help
redis-cli 7.0.0
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 preferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc
127.0.0.1:6379>

help @ 查看命令组的帮助
help @generic 查看通用组的命令包括del,dump…等等通用命令。
help @string 查看字符串组命令。还可以查看其他组的命令如help @list, help @set, help @sorted_set,help @hash 等等。
help 之后按tab按键可提示参数,查看所有的分组可以通过help <tab>提示。

help  查看具体命令的用法如下:
127.0.0.1:6379> help get
  GET key
  summary: Get the value of a key
  since: 1.0.0
  group: string


3,Redis 全局 Key 操作

命令	  含义
KEYS *	查看KEY支持通配符
DEL	    删除给定的一个或多个key
EXISTS	检查是否存在
RENAME	变更KEY名
SORT	键值排序,有非数字时报错
TYPE	返回键所存储值的类型
DUMP RESTORE	序例化与反序列化
EXPIRE\ PEXPIRE	以秒\毫秒设定生存时间
TTL\ PTTL	以秒\毫秒为单位返回生存时间
PERSIST	取消生存实现设置
RANDOMKEY	返回数据库中的任意键

一,常用 keys 命令
1、del 命令
del 命令用来 删除指定的一个或多个 key
删除一个 key
127.0.0.1:6379> set test 1234
127.0.0.1:6379> del test

删除多个 key
127.0.0.1:6379> mset test1 1111 test2 2222
127.0.0.1:6379> del test1 test2

2、exists 命令
exists 命令用来查询 key 是否存在
127.0.0.1:6379> mset test1 1111 test2 2222
192.168.152.133:6379> EXISTS test1
(integer) 1

3、expire 命令
expire 命令用来 设置 key 的过期秒数
127.0.0.1:6379> get test1
与 expire 命令相关的命令有三个,分别是:
expireat 命令用来 设置一个 UNIX 时间戳的过期时间, 
(从1970年1月1日0时0分0秒到你设置过期的秒数)
127.0.0.1:6379> EXPIREAT test2 1592965943
(integer) 1
pexpire 命令用来 设置 key 的有效时间以毫秒为单位
127.0.0.1:6379> EXPIRE test3 100
(integer) 1
127.0.0.1:6379> ttl test3
(integer) 94
127.0.0.1:6379> pttl test3
(integer) 89235
pexpireat 命令用来 设置 key 的到期 UNIX 时间戳以毫秒为单位
127.0.0.1:6379> PEXPIREAT test3 1592965943000
(integer) 1
192.168.152.133:6379> ttl test3
(integer) 365


二,keys 命令
keys 命令用来 查找所有匹配给定的模式的键
127.0.0.1:6379> keys *
1) "a"
2) "test"
3) "test1"
4) "name"
在 Redis 中是支持模糊查询的,它有 3 个通配符,分别是:*、 ? 和 []
*:通配任意多个字符
?:通配单个字符
[]:通配括号内的某 1 个字符
上面介绍了关于 * 的用法,下面来简单的看一下 ? 和 [] 的用法
[] 的用法如下:
127.0.0.1:6379> keys *[s]*
1) "test"
2) "test1"
127.0.0.1:6379> keys *[a]*
1) "a"
2) "name"
? 的用法如下:
127.0.0.1:6379> set a bbb
OK
127.0.0.1:6379> keys ?
1) "a"
ttl 命令
ttl 命令用来 获取 key 的有效时间(单位:秒)
127.0.0.1:6379> get test1
上面的命令是,我们用 expire 对一个 key 设置一个过期时间,然后使用 
ttl 观察它的剩余时间
ttl 一个 key,如果返回 -1,则说明该 key 不会过期
ttl 一个 key,如果返回 -2,则说明没有指定的 key
与 ttl 相关的命令是 pttl 命令,它用来 获取 key 的有效毫秒数
rename 命令
rename 命令用来 将一个 key 重命名
127.0.0.1:6379> rename url url1234

4,Redis String(字符串)

string是redis最基本的类型,一个key对应一个value。一个键最大能存储 512MB。

命令	           描述
SET key value	设置指定 key 的值
GET key	        获取指定 key 的值。
GETSET key value 将给定 key 的值设为value,并返回key的旧值(old value)
MGET key1 [key2..]	获取所有(一个或多个)给定 key 的值。
SETEX key seconds value	将值value关联到key并将key的过期时间设为
seconds (以秒为单位)。
SETNX key value	只有在 key 不存在时设置 key 的值。
MSET key value [key value ...]	同时设置一个或多个 key-value 对。
....

String 操作介绍:
代码示例:
对不存在的键进行设置:
redis> SET key "value"
OK
redis> GET key

"value"对已存在的键进行设置:
redis> SET key "new-value"
OK

redis> GET key
"new-value"


5.Redis Hash(字典)

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

HSET语法

HSET hash field value
将哈希表 hash 中域 field 的值设置为 value 。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。

代码示例:
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> hset xingdian age 18
(integer) 1
127.0.0.1:6379> HSET xingdian password diandian
(integer) 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> HGET xingdian age
"18"
127.0.0.1:6379> HGET xingdian password
"diandian"

设置一个新域;
127.0.0.1:6379> HSET website goole "www.g.cn"
(integer) 1
127.0.0.1:6379> HGET website goole
"www.g.cn"
对一个已存在的域进行更新:
127.0.0.1:6379> HSET website goole "www.google.com"
(integer) 0
127.0.0.1:6379> hget website goole
"www.google.com"
127.0.0.1:6379>

HSETNX 
语法:
HSETNX hash field value
当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。
如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。
返回值:
HSETNX 命令在设置成功时返回1,在给定域已经存在而放弃执行设置操作时返回0.
代码示例:
域尚未存在, 设置成功:
redis> HSETNX database key-value-store Redis
(integer) 1

redis> HGET database key-value-store
"Redis"
域已经存在, 设置未成功, 域原有的值未被改变:
redis> HSETNX database key-value-store Riak
(integer) 0

redis> HGET database key-value-store
"Redis"


HGET
语法:
HGET hash field
返回哈希表中给定域的值
返回值:
HGET 命令在默认情况下返回给定域的值。
如果给定域不存在于哈希表中,又或者给定的哈希表并不存在,那么命令返回nil
代码示例:
域存在的情况:
redis> HSET homepage redis redis.com
(integer) 1

redis> HGET homepage redis
"redis.com"
域不存在的情况:
redis> HGET site mysql
(nil)

6.Redis LIST(列表)

LIST 介绍
List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
List中可以包含的最大元素数量是4294967295。

命令	         描述
BLPOP key1 [key2 ] timeout	移出并获取列表的第一个元素,
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOP key1 [key2 ] timeout	移出并获取列表的最后一个元素,
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOPLPUSH source destination timeout	从列表中弹出一个值,将弹出的
元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待
超时或发现可弹出元素为止。

LINDEX key index	通过索引获取列表中的元素
LINSERT key BEFORE|AFTER pivot value在列表的元素前或者后插入元素
LLEN key	获取列表长度
LPOP key	移出并获取列表的第一个元素
LPUSH key value1 [value2]	将一个或多个值插入到列表头部
LPUSHX key value	将一个值插入到已存在的列表头部
LRANGE key start stop	获取列表指定范围内的元素
LREM key count value	移除列表元素
LSET key index value	通过索引设置列表元素的值
LTRIM key start stop	对一个列表进行修剪(trim),就是说,让列表只
保留指定区间内的元素,不在指定区间之内的元素都将被删除。
RPOP key	移除并获取列表最后一个元素
RPOPLPUSH source destination  移除列表的最后一个元素,并将该元素添加到
另一个列表并返回
RPUSH key value1 [value2]	在列表中添加一个或多个值
RPUSHX key value	为已存在的列表添加值

LIST 应用场景
消息队列系统,比如sina微博
在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。但是做了限制
不能超过5000个ID,因此获取ID的函数会一直询问Redis。只有在start/count
参数超出了这个范围的时候,才需要去访问数据库。
系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数
据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会
被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
LIST 操作介绍
LPUSH
语法
LPUSH key value [value …]
    将一个或多个值 value 插入到列表 key 的表头
    如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到
    表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表
    的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH 
    mylist b 和 LPUSH mylist c 三个命令。
    如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
    当 key 存在但不是列表类型时,返回一个错误。
返回值:
执行 LPUSH 命令后,列表的长度。
代码示例:
# 加入单个元素

redis> LPUSH languages python
(integer) 1


# 加入重复元素

redis> LPUSH languages python
(integer) 2

redis> LRANGE languages 0 -1     # 列表允许重复元素
1) "python"
2) "python"


# 加入多个元素

redis> LPUSH mylist a b c
(integer) 3

redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"

7.Redis SET(集合)

SET 介绍
Set类型看作为没有排序的字符集合。Set可包含的最大元素数量是4294967295。如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。

命令	    描述
SADD key member1 [member2]	向集合添加一个或多个成员
SCARD key	获取集合的成员数
SDIFF key1 [key2]	返回给定所有集合的差集
SDIFFSTORE destination key1 [key2]	返回给定所有集合的差集并存储
在 destination 中
SINTER key1 [key2]	返回给定所有集合的交集
SINTERSTORE destination key1 [key2]	返回给定所有集合的交集并存储
在 destination 中
SISMEMBER key member	判断 member 元素是否是集合 key 的成员
SMEMBERS key	返回集合中的所有成员
SMOVE source destination member	将 member 元素从 source集合移动到
 destination 集合
SPOP key	移除并返回集合中的一个随机元素
SRANDMEMBER key [count]	返回集合中一个或多个随机数
SREM key member1 [member2]	移除集合中一个或多个成员
SUNION key1 [key2]	返回所有给定集合的并集
SUNIONSTORE destination key1 [key2]	所有给定集合的并集存储在 
destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count]	迭代集合中的元素

SET 操作介绍
SADD
语法:
SADD key member [member …]
    将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的member 元素将被忽略。
    假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
    当 key 不是集合类型时,返回一个错误。
返回值:
被添加到集合中的新元素的数量,不包括被忽略的元素。
代码示例:
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> SADD jihe chen  li gao
(integer) 3
127.0.0.1:6379> SET jihe a
OK
127.0.0.1:6379> GET jihe
"a"
127.0.0.1:6379> SADD jihe a b c
(error) WRONGTYPE Operation against a key holding the wrong kind of value
代码示例:
127.0.0.1:6379> SADD haha a b c
(integer) 3
127.0.0.1:6379> SADD haha b
(integer) 0
127.0.0.1:6379> SADD haha d
(integer) 1
127.0.0.1:6379> SMEMBERS haha
1) "d"
2) "b"
3) "c"
4) "a"

# 添加单个元素

redis> SADD bbs "discuz.net"
(integer) 1


# 添加重复元素

redis> SADD bbs "discuz.net"
(integer) 0


# 添加多个元素

redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2

redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

8.Redis SortedSet(有序集合)

SortedSet 介绍
Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过
分数来为集合中的成员进行从小到大的排序。成员是唯一的,但是分数(score)
却是可以重复的。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中
最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
命令	描述
ZADD key score1 member1 [score2 member2]	向有序集合添加一个或多个
成员,或者更新已存在成员的分数
ZCARD key	获取有序集合的成员数
ZCOUNT key min max	计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member	有序集合中对指定成员的分数加上增量
 increment
ZINTERSTORE destination numkeys key [key ...]	计算给定的一个或多
个有序集的交集并将结果集存储在新的有序集合 key 中
ZLEXCOUNT key min max	在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES]	通过索引区间返回有序集合成指定区间
内的成员
ZRANGEBYLEX key min max [LIMIT offset count]	通过字典区间返回有序
集合的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]	通过分数返回有序集合
指定区间内的成员
ZRANK key member	返回有序集合中指定成员的索引
ZREM key member [member ...]	移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max	移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop	移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max	移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start stop [WITHSCORES]	返回有序集中指定区间内的成员,
通过索引,分数从高到底
ZREVRANGEBYSCORE key max min [WITHSCORES]	返回有序集中指定分数区间内
的成员,分数从高到低排序
ZREVRANK key member	返回有序集合中指定成员的排名,有序集成员按分数值
递减(从大到小)排序
ZSCORE key member	返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...]	计算给定的一个或多个
有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]	迭代有序集合中的元素
(包括元素成员和元素分值)

SortedSet 应用场景
排行榜应用,取TOP N操作这个需求与上面需求的不同之处在于,前面操作以时间
为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的
sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据
设置成相应的value,每次只需要执行一条ZADD命令即可。
SortedSet  操作介绍
ZADD
语法:
ZADD key score member [[score member] [score member]]
    将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
    如果某个 member 已经是有序集的成员,那么更新这个 member 的 score值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
    score 值可以是整数值或双精度浮点数。
    如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
    当 key 存在但不是有序集类型时,返回一个错误。
    对有序集的更多介绍请参见 sorted set 。
返回值:
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
代码示例:
127.0.0.1:6379>ZADD class-cloud 100 chenlong 80 wenxiang 90 tongtong  60 shuaishuai
(integer) 4
127.0.0.1:6379> ZRANGE class-cloud
(error) ERR wrong number of arguments for 'zrange' command
127.0.0.1:6379> ZRANGE class-cloud 0 -1
1) "shuaishuai"
2) "wenxiang"
3) "tongtong"
4) "chenlong"
127.0.0.1:6379> ZRANGE class-cloud 0 -1 WITHSCORES
1) "shuaishuai"
2) "60"
3) "wenxiang"
4) "80"
5) "tongtong"
6) "90"
7) "chenlong"
8) "100"
127.0.0.1:6379> ZADD class-cloud 110 shuaishuai
(integer) 0
127.0.0.1:6379> ZRANGE class-cloud 0 -1 WITHSCORES
1) "wenxiang"
2) "80"
3) "tongtong"
4) "90"
5) "chenlong"
6) "100"
7) "shuaishuai"
8) "110"
127.0.0.1:6379> ZREM class-cloud chenlong
(integer) 1
127.0.0.1:6379> ZRANGE class-cloud 0 -1 WITHSCORES
1) "wenxiang"
2) "80"
3) "tongtong"
4) "90"
5) "shuaishuai"
6) "110"
# 添加单个元素

redis> ZADD page_rank 10 google.com
(integer) 1


# 添加多个元素

redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,且 score 值不变

redis> ZADD page_rank 10 google.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,但是改变 score 值

redis> ZADD page_rank 6 bing.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  
# bing.com 元素的 score 值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenshuai199533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值