redis简介
REmote DIctionary Server(Redis) 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
redis安装
yum安装
#前提得配置好阿里云yum源,epel源
#查看是否有redis包
yum list redis
#安装redis
yum install redis -y
#安装好,启动redis
systemctl start redis
### 源码编译安装 ```linux 1.下载redis源码 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩 tar -zxf redis-4.0.10.tar.gz 3.切换redis源码目录 cd redis-4.0.10 4.编译源文件 make 5.编译好后,src/目录下有编译好的redis指令 6.make install 安装到指定目录,默认在/usr/local/bin
## redis配置
新建一个配置文件redis-6379.conf,新建/data/6379/目录,在配置文件写入如下内容
```linux
# redis-6379.conf配置如下:
port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dir /data/6379
protected-mode yes
requirepass haohaio
redis的一些执行文件的作用
./redis-benchmark # 用于进行redis性能测试的工具
./redis-check-dump # 用于修复出问题的dump.rdb文件
./redis-cli # redis的客户端
./redis-server # redis的服务端
./redis-check-aof # 用于修复出问题的AOF文件
./redis-sentinel # 用于集群管理
redis启动
redis-server是redis的服务端,切换到redis-server的目录,执行以下命令启动redis服务端
./redis-server /redis-6379.conf
使用以下命令启动客户端
# 执行客户端命令即可进入
./redis-cli
# 或指定参数
redis-cli -p 6380 -a zhuanqq
-p 设置redis链接的端口
-a 显示的填写密码
--raw 使用原始格式
# 测试是否连接上redis
127.0.0.1:6379 > ping
返回pong代表连接上了
# 用set来设置key、value
127.0.0.1:6379 > set name "tiger"
OK
# get获取name的值
127.0.0.1:6379 > get name
"tiger"
redis数据结构
redis是一种高级的key-value结构,其中key只能是strings,而value支持5种数据类型
- 字符串(strings)
- 散列(hashes)
- 列表(lists)
- 集合(sets)
- 有序集合(sorted sets)
strings
- set 设置key
- get 获取key
- append 追加string
- mset 设置多个键值对
- mget 获取多个键值对
- del 删除key
- incr 递增+1
- decr 递减-1
127.0.0.1:6379> set name 'robin' # 设置name的值为robin
OK
127.0.0.1:6379> get name # 获取name的值
"robin"
127.0.0.1:6379> set name 'sophia' # 重设name的值
OK
127.0.0.1:6379> get name
"sophia"
127.0.0.1:6379> append name ' is a girl' # 给name追加值
(integer) 16
127.0.0.1:6379> get name
"sophia is a girl"
127.0.0.1:6379> mset user1 'robin' user2 'sophia' # 设置多个值
OK
127.0.0.1:6379> get user1
"robin"
127.0.0.1:6379> get user2
"sophia"
127.0.0.1:6379> mget user1 user2 # 获取多个值
1) "robin"
2) "sophia"
127.0.0.1:6379> keys * # 获取所有key
1) "123"
2) "lst"
3) "user2"
4) "(1,2)"
5) "name"
6) "user1"
7) "age"
8) "num"
9) "user"
lists
- lpush 从列表左边插入
- rpush 从列表右边插入
- lrange 获取一定长度的元素 lrange key start stop
- ltrim 截取一定长度列表
- lpop 删除最左边一个元素
- rpop 删除最右边一个元素
- lpushx/rpushx key存在则添加值,不存在不处理
127.0.0.1:6379> lpush l1 'robin' 'yousa' 'mandy'
(integer) 3
127.0.0.1:6379> llen l1 # 查看l1的长度
(integer) 3
127.0.0.1:6379> lrange l1 0 -1 # 查看l1的所有元素
1) "mandy"
2) "yousa"
3) "robin"
127.0.0.1:6379> rpush l1 'hanser'
(integer) 4
127.0.0.1:6379> lrange l1 0 -1
1) "mandy"
2) "yousa"
3) "robin"
4) "hanser"
127.0.0.1:6379> lpushx l2 'hh'
(integer) 0
127.0.0.1:6379> ltrim l1 0 2 # 切片,顾头也顾尾
OK
127.0.0.1:6379> lrange l1 0 -1
1) "mandy"
2) "yousa"
3) "robin"
127.0.0.1:6379> lpop l1 # 删除左边
"mandy"
127.0.0.1:6379> lrange l1 0 -1
1) "yousa"
2) "robin"
127.0.0.1:6379> rpop l1 # 删除右边
"robin"
127.0.0.1:6379> lrange l1 0 -1
1) "yousa"
set
sadd/srem 添加/删除 元素
sismember 判断是否为set的一个元素
smembers 返回集合所有的成员
sdiff 返回一个集合和其他集合的差异
sinter 返回几个集合的交集
sunion 返回几个集合的并集
127.0.0.1:6379> sadd girls sara sophia mandy # 创建集合girls,添加三个元素
(integer) 3
127.0.0.1:6379> smembers girls # 查看集合所有元素
1) "sophia"
2) "mandy"
3) "sara"
127.0.0.1:6379> srem girls sara # 删除元素
(integer) 1
127.0.0.1:6379> smembers girls
1) "sophia"
2) "mandy"
127.0.0.1:6379> sadd ups mandy hanser yousa # 添加另一个集合
(integer) 3
127.0.0.1:6379> sdiff girls ups # 返回girls有而ups没有的元素
1) "sophia"
127.0.0.1:6379> sdiff ups girls # 返回ups有而girls没有的元素
1) "yousa"
2) "hanser"
127.0.0.1:6379> sinter girls ups # 返回两个集合都有(交集)的元素
1) "mandy"
127.0.0.1:6379> sunion girls ups # 返回两个集合的并集(去重)
1) "yousa"
2) "sophia"
3) "hanser"
4) "mandy"
hash
hashes即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。
hashes存的是字符串和字符串值之间的映射,hash特别适合用于存储对象,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
- hset 设置散列值
- hget 获取散列值
- hgetall获取在哈希表中指定 key 的所有字段和值
- hmset 设置多对散列值
- hmget 获取多对散列值
- hsetnx 如果散列已经存在,则不设置(防止覆盖key)
- hkeys 返回所有keys
- hvals 返回所有values
- hlen 返回散列包含域(field)的数量
- hdel 删除散列指定的域(field)
- hexists 判断是否存在
127.0.0.1:6379> hset news title "today's news title" # 新建一个hash news,并设置news的title
(integer) 1
127.0.0.1:6379> hset news content "news content" # 设置news的content
(integer) 1
127.0.0.1:6379> hget news title # 获取news的title
"today's news title"
127.0.0.1:6379> hget news content
"news content"
127.0.0.1:6379> hmget news title content # 获取多个值
1) "today's news title"
2) "news content"
127.0.0.1:6379> hmset news2 title "second news title" content "second content"
OK
127.0.0.1:6379> hmget news2 title content
1) "second news title"
2) "second content"
127.0.0.1:6379> hkeys news # 获取news的所有key
1) "title"
2) "content"
127.0.0.1:6379> hlen news # 获取news的长度
(integer) 2
127.0.0.1:6379> hdel news title # 删除title
(integer) 1
127.0.0.1:6379> hlen news
(integer) 1
127.0.0.1:6379> hexists news title # 判断news的title是否存在,存在返回1,不存在返回0
(integer) 0