redis-基础介绍
Redis(Remote Dictionary Server ),即远程字典服务,是有一个免费开源的NoSQL产品。
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
redis是将全部数据放在内存中,所以使用单线程去操作效率就是最高的,对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上。
redis的安装与配置
redis官网:https://redis.io/
redis中文网:https://www.redis.net.cn/
阿里云服务器安装Redis
下载的源码进行编码,编译依赖gcc环境
yum install gcc-c++
在Linux服务器新建文件夹存放redis
进入 /usr/local/
下载redis
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
解压刚刚下载的redis
tar -zvxf redis-6.2.6.tar.gz
移动redis目录,一般都会将redis目录放置到 /usr/local/redis目录:
mv redis-6.2.6 /usr/local/redis
输入命令编译文件
make
make命令执行完,redis就编译完成了。
执行下面命令安装redis,并指定安装目录
make install PREFIX=/usr/local/redis
prefix这个关键字的作用是编译的时候用于指定程序存放的路径。
假设不添加该关键字Linux会将:
可执行文件存放在/usr/local/bin目录;
库文件会存放在/usr/local/lib目录;
配置文件会存放在/usr/local/etc目录;
其他的资源文件会存放在usr/local/share目录
这里指定目录之后,方便后续卸载,直接rm -rf /usr/local/redis 即可删除redis。
启动Redis
进入redis安装目录,执行下面命令启动redis服务
## 此时未修改redis任何配置文件,默认连接redis密码为空。 ## 采取后台进程方式启动 cd /usr/local/redis ./bin/redis-server redis.conf
查看Redis是否正在运行
## (1)采取查看进程方式 ps -aux|grep redis ## (2)采取端口监听查看方式 netstat -lanp|grep 6379 ## (3)采取查看进程方式 ps -ef | grep redis
修改配置文件
注释掉bind 127.0.0.1
保护模式修改:protected-mode的值默认为yes,将其修改为no;
守护进程修改daemonize的值默认为no,将其修改为yes
redis密码修改:requirepass
设置 redis 连接密码,这里设置密码为x----f
更新配置文件后重启
ps -ef|grep redis
kill -9 进程号
cd /usr/local/redis
./bin/redis-server ./redis.conf
(因设置了守护进程,此操作同采取后台进程方式)
测试redis
通过redis-cli测试redis是否可用,在redis安装目录执行下面命令:
./bin/redis-cli # 若想正确显示中文 ./bin/redis-cli --raw
然后再输入auth +空格+ 刚才设置的密码
此处我们通过下面命令随便set一个字符串类型的值,key是test,value是hello:
127.0.0.1:6379> set test hello OK
然后通过下面命令get出test这个key的value值:
127.0.0.1:6379> get test "hello"
退出redis
127.0.0.1:6379> exit
redis的基本知识
切换数据库
redis默认有16个数据库,通过0-15标识,默认使用的是第0个数据库,可以使用select切换数据库
select 1 #切换1数据库
DBSIZE #查看DB大小
flushdb #清空当前库
flushall #清空数据库
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> DBSIZE
0
127.0.0.1:6379[1]>
redis 键值对说明
redis是key-value的数据结构
每一条数据都是一个“键值对”
key的类型永远是string字符串
value类型有五种:
字符串 string
哈希 hash
列表 list
无序集合 set
有序集合 zset
Redis三种特殊数据类型
geospatial 地理位置 (定位、附近的人、打车距离……)
hyperloglog 基数 (不重复的元素个数) 可以接受误差 大概有0.81%的错误率
bitmaps 位存储 长用于统计用户信息 活跃 不活跃 登录 未登录 打卡
字符串 string
string介绍
字符串 string是redis中最基本的类型
增加、修改
如果键存在,就是修改;如果键不存在,就是添加
redis 中字符串(string)可以用单引号'',或者双引号""引起来,也可以省略引号,如"china"、'china'、china 都可以
设置键
set key value
如: set 'user1' 'aaa'
127.0.0.1:6379> set 'user1' 'aaa'
OK
127.0.0.1:6379> set 'user1' 'bbb'
OK
127.0.0.1:6379> get user1
bbb
设置键值及过期时间,以秒为单位
setex key seconds value
如:添加一个键user2,值是bbb,过期时间是3s
127.0.0.1:6379> setex user2 3 bbb
OK
添加多个键值对 mset
mset key1 value1 key2 value2...
127.0.0.1:6379> mset user3 ccc user4 ddd user5 eee
OK
127.0.0.1:6379> keys *
user1
user4
user5
user3
在已有值后面追加值 append
127.0.0.1:6379> append user1 1234
7
127.0.0.1:6379> get user1
bbb1234
获取
获取单个值 get
127.0.0.1:6379> get user1
bbb1234
获取多个值 mget
127.0.0.1:6379> mget user1 user2 user3 user4 user5
bbb1234
ccc
ddd
eee
删除
删除键 del
127.0.0.1:6379> del user5
1
127.0.0.1:6379> mget user1 user2 user3 user4 user5
bbb1234
ccc
ddd
127.0.0.1:6379> del user3 user4
# 删除多个键
2
127.0.0.1:6379> mget user1 user2 user3 user4 user5.
bbb1234
127.0.0.1:6379>
键命令
查找键 keys
查看所有键 keys *
keys * #查看所有key
127.0.0.1:6379> keys *
user2
user4
user1
user5
test
user3
查看指定键 keys
127.0.0.1:6379> keys user1
user1
127.0.0.1:6379> keys user0
127.0.0.1:6379>
判断键是否存在 exists
; 存在返回1,不存在返回0
127.0.0.1:6379> exists user1
1
127.0.0.1:6379> exists user0
0
127.0.0.1:6379>
查看键值类型 type user2
127.0.0.1:6379> type user1
string
对已经存在的键追加过期时间 expire 'user2' 100
127.0.0.1:6379> expire 'user2' 100
1
查看键有效时间 ttl
返回>0,代表有效时间 s
返回-1,永远有效
返回-2,键不存在
127.0.0.1:6379> ttl user2
22
127.0.0.1:6379> ttl user1
-1
127.0.0.1:6379> ttl user0
-2
哈希 hash
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value。将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
增加、修改
如果设置的字段存在,就是修改;如果字段不存在,就是添加
hset key field value
# 设置一个key中的属性映射
hmset key field1 value1 field2 value2
# hmset:批量设置属性映射
案例:
增加一个hash类型键值对huser1,字段为name,值为tom
127.0.0.1:6379> hset huser1 name tom
1
添加多个hash字段值 hmset huser2 name mary sex female
127.0.0.1:6379> hmset huser2 name mary sex female
OK
获取
获取指定键所有的字段。
hkeys key
案例:获取键“huser2”的所有字段
127.0.0.1:6379> hkeys huser2
name
sex
获取一个字段对应的值
hget key field
案例:获取键“huser2”字段“name”的值
127.0.0.1:6379> hget huser2 name
mary
获取多个字段的值
hmget key field1 field2 ...
案例:获取键“huser2”字段“name”、“sex”的值
127.0.0.1:6379> hmget huser2 name sex
mary
female
获取所有字段的值
hvals key
案例:获取键“huser2”所有字段的值
127.0.0.1:6379> hvals huser2
mary
female
获取所有字段名包括字段对应的值
hgetall key
案例:获取键“huser2”所有字段名包括字段对应的值
127.0.0.1:6379> hgetall huser2
name
mary
sex
female
删除
删除hash中指定字段
字段对应的值会一起删除
hdel key field1 field2 ...
案例:删除键’huser2‘的字段 ’sex‘
127.0.0.1:6379> hdel huser2 sex
1
删除整个hash键及字段与值 ,使用del命令
del key1 key2 ...
案例:删除键"huser1","huser2"
127.0.0.1:6379> del huser1 huser2
2
列表list
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
redis中,可以将list用作栈、队列、阻塞队列的数据结构
所有list命令都是以l,r开头
redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的
增加
从左侧插入值
lpush key value1 value2 ...
案例:新建一个键luser1,向左侧添加值aa
127.0.0.1:6379> lpush luser1 aa
1
从右侧插入值
rpush key value1 value2 ...
案例:在键luser1的右侧添加值bb
127.0.0.1:6379> rpush luser1 bb
2
127.0.0.1:6379> rpush luser1 cc dd
4
在指定的值前或者后插入值
linsert key before/after 值 插入的值
案例:向luser1插入值11,插在cc之前
127.0.0.1:6379> linsert luser1 before cc 11
5
案例:向luser1插入值22,插在cc之后
127.0.0.1:6379> linsert luser1 after cc 22
6
获取
返回列表里指定范围内的值
索引从左侧开始,第一个值的索引为0;
索引可以是负数,表示从尾部开始计数,如:-1表示最后一个值
start,stop 为要获取值的索引。
lrange key start stop
案例:获取键luser1的列表所有的值:
127.0.0.1:6379> lrange luser1 0 -1
aa
bb
11
cc
22
dd
127.0.0.1:6379> lrange luser1 2 4
11
cc
22
修改
设置修改指定索引位置的值
lset key index value
案例:把键luser1的列表中索引为1的即第二个元素的值改为china
127.0.0.1:6379> lset luser1 1 china
OK
127.0.0.1:6379> lrange luser1 0 -1
aa
china
11
cc
22
dd
删除
lrem key count value
count: 将列表中前count次出现的值移除
count>0 从头往尾删除
count<0 从尾往头删除
count=0 删除所有值(重复值)
现有一个luser2
127.0.0.1:6379> rpush luser2 h0 h1 h2 h3 h0 h1 h0 h1
8
127.0.0.1:6379> lrange luser2 0 -1
h0
h1
h2
h3
h0
h1
h0
h1
案例:从键luser2 列表右侧开始删除1个h1
127.0.0.1:6379> lrem luser2 -1 h1
1
127.0.0.1:6379> lrange luser2 0 -1
h0
h1
h2
h3
h0
h1
h0
案例:从键luser2 列表左侧开始删除2个h1
127.0.0.1:6379> lrem luser2 2 h1
2
127.0.0.1:6379> lrange luser2 0 -1
h0
h2
h3
h0
h0
案例:从键luser2 列表中删除所有的h0
127.0.0.1:6379> lrem luser2 0 h0
3
127.0.0.1:6379> lrange luser2 0 -1
h2
h3
无序集合set
一个键中有一个set,一个set中有多个无序的字符串
集合中不允许有重复值,所以只能添加删除查询,不能修改
添加
集合中添加值
sadd key value1 value2...
案例:向键suser1 的集合添加值aa ,bb,cc
127.0.0.1:6379> sadd suser1 aa bb cc
3
获取集合值
smembers key
案例:获取键suser1 的集合所有值
127.0.0.1:6379> smembers suser1
aa
cc
bb
删除值
srem key value
案例:删除集合中键为suser1 中的值bb
127.0.0.1:6379> srem suser1 bb
1
127.0.0.1:6379> smembers suser1
aa
cc
有序集合zset
有序集合中的每一个值都会关联一个分数(score),分数可以为负数,通过分数大小将之排序,通过索引定位值的位置(与列表不同)
只能添加删除,不能修改
添加
zadd key score1 value1 score2 value2...
案例:向键zuser1 的集合中添加值aa ,bb,cc,dd,分数分别为1,5,8,3
127.0.0.1:6379> zadd zuser1 1 aa 5 bb 8 cc 3 dd
4
获取
获取指定范围内的值
withscores:同时获取对应分数
zrange key start stop [withscores]
案例:获取键zuser1 的集合所有值
127.0.0.1:6379> zrange zuser1 0 -1
aa
dd
bb
cc
127.0.0.1:6379> zrange zuser1 0 -1 withscores
aa
1
dd
3
bb
5
cc
8
通过score获取值
zrangebyscore key min max
案例:获取键zuser1 的score从2~6之间的值
127.0.0.1:6379> zrangebyscore zuser1 2 6
dd
bb
通过值返回score
zscore 键 值
127.0.0.1:6379> zscore zuser1 dd
3
删除
删除指定值
zrem key value1 value2
127.0.0.1:6379> zrem zuser1 cc dd
2
127.0.0.1:6379> zrange zuser1 0 -1
aa
bb
通过score删除指定范围的值
zremrangebyscore key min max
127.0.0.1:6379> zremrangebyscore zuser1 0 2
1
127.0.0.1:6379> zrange zuser1 0 -1 withscores
bb
5
评论