Redis
一、Redis安装和概述
1.1、概述
Redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务,
Redis是一个开源的key-value存储系统,当下最热门的NoSQL 技术之一。
1.2、安装
1.把redis-6.2.6.tar.gz上传到/opt文件夹
2.查看是否有gcc编译环境 gcc --version
如果没有则进行安装 yum install gcc
3.解压redis-6.2.6.tar.gz文件 tar -zxvf redis-6.2.6.tar.gz
解压之后进入到redis-6.2.6文件夹 cd redis-6.2.6
输入不含参数make命令进行编译 make
安装redis make install
1.3查看安装目录
1.3.1、默认的目录:/usr/local
1.redis-benchmark:性能测试工具,可以在自己的本子运行看看性能如何
2.redis-check-aof:恢复有问题的AOF文件
3.redis-check-dump:恢复有问题的dump.rdb文件
4.redis-sentinel:Redis集群使用
5.redis-server:Redis服务器启动命令
6.redis-cli:客户端,操作入口
1.3.2、后台启动Redis
1、进入/opt,查看目录,把redis.conf复制到/etc文件名为redis.conf
2、后台设置daemonize no改成yes
3、redis启动 启动命令:redis-server /etc/redis.conf
4、查看服务器进程:ps -ef | grep redis
5、通过客户端链接Redis 命令:redis-cli
6、关闭Redis:
- shutdown
- exit
- kill -9 3837
1.3.3、测试性能
redis-benchmark是一个压力测试工具!
redis-benchmark 命令参数
redis-benchmark [option] [option value]
简单测试一下:
# 测试:100个并发连接 100000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
二、Redis键(key)
- keys * :查看当前库中所有的key
- set key value :向当前库中添加key和value
- exists key :判断某个key是否存在
- type key :查看指定key的数据类型
- del key : 删除指定的key数据
- unlink key:根据value选择非阻塞删除
紧将keys从keyspace元数据中删除,真正删除会在后续的异步操作
- expire key 10:10秒钟为key设置过期时间
- MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
- move name 1 移除当前的key
- PERSIST key 移除 key 的过期时间,key 将持久保持。
- RANDOMKEY 从当前数据库中随机返回一个 key 。
- RENAME key newkey 修改 key 的名称
- TYPE key 返回 key 所储存的值的类型。
- ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
- select 命令切换数据库
- dbsize:查看当前数据库的key的数量
- flushdb:清空当前库
- flushall:通杀全部库
三、redis字符串(String)
3.1、String
1、String是Redis的基本数据类型,一个keyduiyin
2、String是二进制安全的,可以包含任何数据。比如jpg图片或者序列化对象
3、String中字符串value最多可以是512M
3.2、String的基本操作
set key value 添加键值对
get <key> 查询对应的键值对
append <key><value> 将给定的<value>追加到原址的末尾
strlen <key> 获取值的长度
setnx <key><value> 只有在key不存在时设置key的值
setex <key><过期时间><value>
-设置键的同时,设置过期时间,单位秒
incr <key>
-将key中储存的数字值增1
-只能对数字值操作,如果为空,新增值为1
decr <key>
-将key中储存的数字值减1
-只能对数字操作,如果为空,新增值为-1
incrby/decrby <key><步长> 将Key中储存的数字值增减。自定义步长
mset <key1><value1><key2><value2> 同时设置一个或多个key-value键值对
mget <key1><key2><key3> 同时获取一个或多个value
msetnx <key1><value1><key2><value2>...
-同时设置一个或多个key-value对,当且仅当所给定的key不存在时
-原子性,有一个失败则全都失败
getrange <key><起始位置><结束位置>
-获得值的范围,雷士java中的substring,前包,后包
setrange <key><起始位置><value>
-用<value>覆写<key>所储存的字符串的值,从<起始位置>开始(索引从0开始)
getset <key><value> 以旧换新,设置了新值的同时获得旧值。
set user:1 {name:zhangsan,age:20} 设置一个user:1对象 值为json字符串来保存一个对象
3.3、简单测试
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 # 获得值
"v1"
127.0.0.1:6379> EXISTS key1 # 判断key1是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" # 在key1后面追加一个字符串
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 # 获得value的长度
(integer) 7
127.0.0.1:6379> keys * # 获取所有的key
1) "key1"
127.0.0.1:6379> APPEND name "zhangsan" # 追加时如果key不存在,则创建一个新的key
(integer) 8
127.0.0.1:6379> keys *
1) "name"
2) "key1"
127.0.0.1:6379> set key2 "hello,world"
OK
127.0.0.1:6379> GETRANGE key2 0 3 # 截取字符串[0,3]
"hell"
127.0.0.1:6379> GETRANGE key2 0 -1 # 截取全部字符串 和 get key是一样的
"hello,world"
27.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同时设置多个key值
OK
127.0.0.1:6379> keys *
1) "name"
2) "k1"
3) "k3"
4) "key1"
5) "key2"
6) "k2"
127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个key值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 20
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "20"
127.0.0.1:6379>
redis的操作是原子性的,不会被线程调度机制大段的操作;
String的数据结构为简单的动态字符串。是可以修改字符串,采用预分配冗余空间的方式来减少内存的频繁分配
四、Redis列表(List)
4.1、基本介绍
1、单键多值
- 简单的字符串列表,按照插入顺序排序。底层是一个双向链表
2、常用命令
lpush/rpush <key><value1><value2><value3>...从左边/右边插入一个或多个值
lpop/rpop <key> 从左边/右边吐出一个值。值在键在,值光键消
rpoppush <key1><key2>从<key1>列表右边吐出来一个值,插到<key2>列表右边
rpoplpush <key1><key2> 移除列表最后一个元素,将其添加到新的列表
lrange <key><start><stop> 按照索引获得元素(从左到右)
lindex <key><index> 按照所给下标获得元素(从左到右)
llne <key> 获取列表的长度
linsert<key> before | after<value><newvalue> 在<value>的后面插入<newvalue>插入值
lrem<key><n><value>从左边删除n个value(从左到右)
lset<key><index><value>将列表key下标为<index>的值替换成<value>
简单测试
127.0.0.1:6379> LPUSH list one # 将一个或多个值,插到列表的头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 # 获取全部的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 # 通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> LRANGE list 0 0
1) "three"
127.0.0.1:6379> RPUSH list hello # 将一个或多个值,插到列表的头部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "hello"
127.0.0.1:6379> LPOP list # 移除list列表的第一个元素
"three"
127.0.0.1:6379> RPOP list # 移除list列表的最后一个元素
"hello"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 1 # 通过下标获得list中的某一个值
"one"
127.0.0.1:6379> LINDEX list 0
"two"
- LLEN
127.0.0.1:6379> LPUSH list 1
(integer) 1
127.0.0.1:6379> LPUSH list 2
(integer) 2
127.0.0.1:6379> LPUSH list 3
(integer) 3
127.0.0.1:6379> LPUSH list 4
(integer) 4
127.0.0.1:6379> LLEN list # 返回list列表的长度
(integer) 4
- LREM 移除指定的值
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> LREM list 1 1 # 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> LPUSH list 4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> LREM list 2 4
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "3"
2) "2"
####################################################################
127.0.0.1:6379> LPUSH list one two three four
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定的长度,list已经被改变了,截断了只剩下截取的元素
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
- rpoplpush 移除列表最后一个元素,将其添加到新的列表
127.0.0.1:6379> rpush list "hello"
(integer) 1
127.0.0.1:6379> rpush list "hello1"
(integer) 2
127.0.0.1:6379> rpush list "hello2"
(integer) 3
127.0.0.1:6379> rpush list "hello3"
(integer) 4
127.0.0.1:6379> rpoplpush list list1
"hello3"
127.0.0.1:6379> lrange list1 0 -1
1) "hello3"
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello1"
3) "hello2"
- lset<key><index><value>将列表key下标为<index>的值替换成<value>
127.0.0.1:6379> EXISTS list
(integer) 0
127.0.0.1:6379> lset list 0 item # 如果不存在列表,就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list hello
(integer) 1
127.0.0.1:6379> lset list 1 item
(error) ERR index out of range
127.0.0.1:6379> lset list 0 item # 如果存在就会替换当前下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "item"
linsert<key> before | after <value><newvalue> 在<value>的后面插入<newvalue>插入值
127.0.0.1:6379> LPUSH list 1
(integer) 1
127.0.0.1:6379> LPUSH list 2
(integer) 2
127.0.0.1:6379> LINSERT list after 2 3
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "2"
2) "3"
3) "1"
127.0.0.1:6379> LINSERT list before 1 0
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "2"
2) "3"
3) "0"
4) "1"