Redis5大数据类型详解

Posted 略懂Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis5大数据类型详解相关的知识,希望对你有一定的参考价值。

Redsi快速入门

Redis官网:https://redis.io
Redis中文网:http://www.redis.cn
Redis源码地址:https://github.com/antirez/redis

NoSQL(Not Only SQL)

  • 关系型数据库(mysql、Oracle、DB2)

    • 结构化数据 :使用关系型数据库表示和存储,表现形式就是二维行列结构;
  • NoSQL:非系型数据库 存储非结构化和半结构化数据

    • 非结构化数据 :没有固定存储结构,文件、图片、音视频等

    • 半结构化数据 :可以认为是结构化数据的一种,只不过不是以二维行列形式存储,但是数据包含相关标记,比如JSON、xml

NoSQL数据库类型

  • 键值对数据库(Key-Value数据库)

    • 代表数据库:Redis、Memcached
  • 列式数据库

    • 代表数据库:谷歌的BigTable、Apache的HBase
  • 文档数据库

    • 这种数据库存储半结构化数据:一般存储为json格式,这种数据库更接近关系型数据库;代表数据库: MongoDB 、 ElasticSearch(ES)
  • 图数据库

    • 并不是存储图片,而是存储数据间关系,适合做社交网络、关系图谱

    • 代表数据库: Neo4J 、 OrientDB

Redis是什么?

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。Redis是纯内存操作,具备很高的读写性能;读的速度能达到110000次/s,写的速度能达到81000次/s。

Redis 能做什么?

缓存、排行榜、计数器(统计浏览量等)、限速器、好友关系(点赞/好友推荐/共同好友)、简单的消息队列、session 服务器等。

centos7安装Redis

安装Development Tools

yum groupinstall -y "Development Tools"

上传安装包 redis-5.0.4.tar.gz 到Centos并解压

tar -zxf redis-5.0.4.tar.gz -C /opt

进入Redis安装目录开始安装

make

cd src/

make install

修改配置文件( redis.conf )

bind 127.0.0.1 注释这一行
protected-mode no (将保护模式修改为no)
daemonize yes (设置为守护进程,把no改为yes)

启动redis server

redis-server mtconfig/redis.conf

启动redis-cli客户端

redis-cli -p 6379

输入ping显示pong代表成功

停止redis服务

redis-cli shutdown

Redis的多数据库特点

  • 不支持自定义数据库名称。不支持为每个数据库设置访问密码。

  • 多个数据库之间不是完全隔离的,FLUSHALL命令会清空所有数据库的数
    据。

  • 多数据库不适用存储不同应用的数据。

  • Redis集群不支持多数据库。

  • Redis默认支持 16个数据库 ,以一个从0开始的递增数字命名,可以通过redis.conf中的 databases 配置。

  • 客户端连接Redis服务器后会自动选择0号数据库,可以通过 SELECT 数据库id
    更换数据库,例如选择15号数据库。

select 15

Redis常用的全局命令

#查看所有的键,支持通配符查询,如: keys name*
keys * 
#测试是否存在指定的key,存在返回1,不存在返回0
exists key 
 #查看key的剩余有效时间, -1 代表永不过期, -2 表示key已经过期
ttl key
expire key seconds #设置key的过期时间,单位是秒
#删除某个key
del key 
#修改key的名称
rename key newkey 
#清空所有数据(会跨库清空数据)
flushall 
#查看数据信息,info Server,info CPU、info Replication
info [section] 
#取消key的过期时间
persist key 

String类型

string类型是redis中最基本的类型,并且是二进制的安全的,可以存储序列化的对象、
二进制图片、一个简单的字符串、数值等。一个字符串类型的键允许存储的数据最大容量是512MB。特别注意: mset 、 mget 在集群环境下无法使用。

1. set命令

作用:赋值;
格式:set key value [expiration EX seconds|PX milliseconds] [NX|XX]
EX seconds -- Set the specified expire time, in seconds.
PX milliseconds -- Set the specified expire time, in milliseconds.
NX -- Only set the key if it does not already exist.
XX -- Only set the key if it already exist.

1.1 举例

127.0.0.1:6379> set name etoak
OK

1.2 设置age为10,5秒后失效

127.0.0.1:6379> set age 10 ex 5
OK
127.0.0.1:6379> get age
"10"
127.0.0.1:6379> get age
 (nil)

1.3 为一个存在的key设置值

127.0.0.1:6379> set name et1810 xx 
OK
127.0.0.1:6379> get name
"et1810"

1.4 如最后加上xx,给一个不存在key(adress)设值,返回nil

127.0.0.1:6379> set address et1810 xx 
(nil)

1.5 为一个不存在的key设值

127.0.0.1:6379> set address bao_tu_quan_bei_lu nx 
OK
127.0.0.1:6379> get address
"bao_tu_qian_bei_lu"

1.6 若最后加上nx,给一个存在的key(name)设值,返回nil

127.0.0.1:6379> set name et nx 
(nil)

2. get命令

作用:获取指定key的值
格式:get key
举例
127.0.0.1:6379> get name

3. setnx命令

作用:当设置的key不存在时则进行设置;若key不存在,返回1;存在,返回0;
格式:setnx key value
举例
127.0.0.1:6379> setnx key1 1
(integer) 1

# 由于key1已经设置,所以再次设置就失败返回了0
127.0.0.1:6379> setnx key1 1 
(integer) 0

4. setex

#作用:设置key的有效时间;key失效后返回nil;
#格式:setex key seconds value
#举例
# 设置key1的值为2,失效时间是5秒
127.0.0.1:6379> setex key1 5 2
OK
127.0.0.1:6379> get key1
"2"
# 5秒后返回nil
127.0.0.1:6379> get key1
(nil)

5. setrange

#作用:替换字符串;
#格式:setrange key offset value
#     offset:从哪个位置开始替换,起始位置是0;
#举例
127.0.0.1:6379> set email luxilejn@163.com
OK
127.0.0.1:6379> setrange email 9 126.com
(integer) 16
127.0.0.1:6379> get email
"luxilejn@126.com"

6. getrange

#作用:获取字符串;
#格式:getrange key start end
#    start:开始下标
#    end:结束下标
#说明:左边起始下标是0,右边起始下标是-1

#举例
127.0.0.1:6379> getrange email 0 -1  获取整个字符串
"luxilejn@126.com"
127.0.0.1:6379> getrange email 0 7
"luxilejn"
127.0.0.1:6379> getrange email 9 -1
"126.com"
127.0.0.1:6379> getrange email -3 -1
"com"

7. mset

#作用:一次为多个key赋值;
#格式:mset key value [key value ...]
#举例
127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
"world"

8. mget

#作用:一次获取key赋值;
#格式:mget key [key ...]

#举例
127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> mget key1 key2
1) "hello"
2) "world"

9. msetnx

#作用:一次为多个不存在的key设置值,成功返回1,表示所有的值都设置了;
#     失败返回0,表示没有任何值被设置,但是不会覆盖已经存在的 key。
#MSETNX is atomic, so all given keys are set at once.

#格式:msetnx key value [key value ...]

#举例
# key3和key4都不存在,所以设置成功,返回1
127.0.0.1:6379> msetnx key3 3 key4 4
(integer) 1
127.0.0.1:6379> mget key3 key4
1) "3"
2) "4"

# 此时key4已经存在,所以设置失败,返回0
127.0.0.1:6379> msetnx key5 5 key4 6
(integer) 0
127.0.0.1:6379> mget key5 key4
1) (nil)
2) "4"

10. getset

# 作用:设置key的值,并返回key的旧值;
# 格式:getset key value

#举例
127.0.0.1:6379> set name et1810
OK
127.0.0.1:6379> getset name etoaker
"et1810"

11. incr

#作用:对key的值做加加操作,并返回新的值。
 #    如果incr一个不是int类型value的key会返回错误,incr一个不存在的 key,则设置key为1;

#格式:incr key

#举例
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> incr age
(integer) 11

# incr一个不存的key,返回1
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> get count
"1"

12.decr

#作用:对key的值做的是减减操作;如果decr一个不存在key,则设置key为-1
#格式:decr key

#举例
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> decr age
(integer) 9
127.0.0.1:6379> decr length  decr一个不存的key,返回-1
(integer) -1
127.0.0.1:6379> get length
"-1

13. incrby

#作用:与incr类似,给定值相加;
#     若key不存在,会设置 key的值为给定的值(Redis认为不存在的key的value是0);
#格式:incrby key increment

#举例
127.0.0.1:6379> incrby age 10
(integer) 19
127.0.0.1:6379> incrby a 10   为不存在的a加10
(integer) 10

14. decrby

#作用:与decr类似,减去给定的值。
#格式:decrby key decrement

#举例
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> decrby age 10
(integer) 90
127.0.0.1:6379> decrby count 10  count不存在
(integer) -10

15. append

#作用:为指定的key的值追加value,返回新字符串值的长度。
#格式:append key value

#举例
127.0.0.1:6379> set email et1810
OK
127.0.0.1:6379> append email @etoak.com
(integer) 16
127.0.0.1:6379> get email
et1810@etoak.com
127.0.0.1:6379> append age 99
(integer) 4
127.0.0.1:6379> get age
"9099"

16. strlen

#作用:得到key对应value值的长度;
#格式:strlen key

#举例
127.0.0.1:6379> set name etoaker
OK
127.0.0.1:6379> strlen name
(integer) 7

hash类型

hash是一个string类型的field和value的映射表。特别适合存储对象,将一个对象存储
在hash类型中会占用更少的内存,而且可以方便的操作对象

1.hset

#作用:设置hash类型值;
#格式:hset key field value

#举例
127.0.0.1:6379> hset user name etoaker
(integer) 1
127.0.0.1:6379> hset user age 100
(integer) 1
127.0.0.1:6379> hget user name
"etoaker"

2. hget

#作用:获取hash类型某个key下的某个field的值
#格式:hget key field

#举例
127.0.0.1:6379> hset user age 100
(integer) 1
127.0.0.1:6379> hget user age
"100"

3. hsetnx

#作用:如果key对应的field不存在,则赋值,存在时什么都不做。
#格式:hsetnx key field value

#举例
# 对一个不存在field设置值
127.0.0.1:6379> hsetnx user address ji_nan
(integer) 1
127.0.0.1:6379> hget user address
"ji_nan"

# 对一个已存在的field设置值
127.0.0.1:6379> hset user name et1810
(integer) 0
127.0.0.1:6379> hget user name
"et1810"
127.0.0.1:6379> hsetnx user name etoak
(integer) 0
127.0.0.1:6379> hget user name
"et1810"

4. hmset

#作用:同时为一个key的设置多个field;
#格式:hmset key field value [field value ...]

#举例
127.0.0.1:6379> hmset user name et1810 age 100 address ji_nan
OK

5. hmget

#作用:同时获取一个key的多个field的值;
#格式:hmget key field [field ...]

#举例
127.0.0.1:6379> hmget user name age address
1) "et1810"
2) "100"
3) "ji_nan"

6. hgetall

#作用:获取一个key下所有field和value
#格式:hgetall key

#举例
127.0.0.1:6379> hgetall user
1) "name"
2) "et1810"
3) "age"
4) "100"
5) "address"
6) "ji_nan"

7. hkeys

#作用:获取key对应的所有的field 
#格式:hkeys key

#举例
127.0.0.1:6379> hkeys user
1) "age"
2) "nage"

8. hvals

#作用:获取key对应的所有value;
#格式:hvals key

#举例
127.0.0.1:6379> hvals user
1) "200"
2) "etoak"

9. hincrby

# 作用:增减数值
# 格式:hincrby key field increment

# 举例
127.0.0.1:6379> hincrby user age 100
(integer) 200
127.0.0.1:6379> hget user age
"200"

10. hdel

#作用:删除key对应的filed的值,field可以写多个
#格式:hdel key field [field ...]

#举例
127.0.0.1:6379> hdel user name address
(integer) 2
127.0.0.1:6379> hgetall user
1) "age"
2) "200"

11. hlen

#作用:返回指定key的field数量。
#格式:hlen key
#举例
127.0.0.1:6379> hlen user
(integer) 2

12. hexists

#作用:测试给定key下的field是否存在。
#格式:hexists key field

#举例
127.0.0.1:6379> hexists user age
(integer) 1
# 表示不存在
127.0.0.1:6379> hexists user pic
(integer) 0

list类型

list是一个链表结构,类似JDK的LinkedList、Queue,主要功能是push、pop、获取一
个范围的所有值等等,key可以认为链表的名称。list类型的每个子元素都是string类型的双向链表,可以通过push、pop从链表的头部或者尾部添加、删除元素;

1. lpush

从头部(链表左侧)添加元素

2. lpop

从list头部获取元素

3. rpush

从尾部(链表右侧)添加元素

4. rpop

从list尾部获取元素

5. lrange

查看list的所有元素:lrange list名称 0 -1

6. linsert

在某个元素的前后插入元素
格式:linsert list before/after 原有元素 新元素

7. lrem

移除元素 lrem list 2(移除个数) “key”

8. rpoplpush

从源list的尾部删除元素,并将其插入到新的list的头部

rpoplpush 源list 目标list

9. lindex

返回指定索引的值
格式:lindex key index
index下标是从0开始的 

10.llen

返回list的元素个数

实现栈

lpush和lpop可以实现栈结构(先进后出)
rpush和rpop实现栈结构(先进后出)

实现队列

lpush和rpop可以实现队列(先进先出)
rpush和lpop实现队列结构(先进先出)

Set

set是string类型的无序不可重复的集合。Set是通过hash table实现的,添加、删除和查

1.add

作用:添加元素 
格式:SADD key member [member ...]

2. smembers

作用:获取集合中所有元素
格式:smembers key

3. sismember

作用:判断元素是否在集合中;如果元素在集合中,则返回1;如否,那么返回0
格式:sismember key member

4.srem

作用:删除元素
格式:srem key member [member ...]

5. scard

作用:获取元素个数,相当于count
格式:scard key

6.spop

作用:随机返回删除的元素
格式:spop key [count]

7. sdiff

作用:差集,返回在第一个set里面 而不在后面任何一个set里面的项(谁在前以谁为标准)
格式:sdiff key [key ...]

8. sdiffstore

作用:差集并保留结果 
格式:sdiffstore destination key [key ...]

9. sinter

作用:交集,返回多个set里面都有的项
格式:sinter key [key ...]

10. sinterstore

作用:交集并保留结果 
格式:sinterstore destination key [key ...]

11. sunion

作用:并集
格式:sunion key [key ...]

12. sunionstore

作用:并集并保留结果
格式:sunionstore destination key [key ...]

13. smove

作用:移动元素到另一个集合
格式:smove source destination member

zset类型

zset有序集合,类似SortedSet。

1. zadd

作用:添加元素;
格式:zadd key score value [score value]

2. zrange

作用:获取索引区间内的元素;(升序)
格式:zrange key start stop [withscores]

2. zrevrange

作用:获取索引区间内的元素;(降序)
格式:zrevrange key start stop [withscores]

3. zrangebyscore

#作用:获取分数区间内的元素;
#格式:zrangebyscore key minscore maxscore [withscore] [limit offset count]
#默认是包含端点值的,如果加上"("表示不包含,后面还可以加上limit来限制。

# - 举例1:
  zrangebyscore set 100 400    获取set中"大于等于100","小于等于400"的元素列表

# - 举例2:
  zrangebyscore set (100 (400  获取set中"大于100","小于400"的元素列表

# - 举例3:
  zrangebyscore set1 (100 (400 withscore limit 0 4 

4. zrem

作用:删除元素
格式:zrem key member [member]

以上是关于Redis5大数据类型详解的主要内容,如果未能解决你的问题,请参考以下文章

java中Redis5大基本类型的用法

(计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换

《Redis5.x入门教程》之准备工作数据类型

Redis5数据类型6-Stream

Redis5.x五种数据类型常见命令

无符号数与有符号数的转换