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类型有五种:

    1. 字符串 string

    2. 哈希 hash

    3. 列表 list

    4. 无序集合 set

    5. 有序集合 zset

  • Redis三种特殊数据类型

    1. geospatial 地理位置 (定位、附近的人、打车距离……)

    2. hyperloglog 基数 (不重复的元素个数) 可以接受误差 大概有0.81%的错误率

    3. 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