一文了解:Redis基础类型

一文了解:Redis基础类型

Redis特点

开源的,BSD许可高级的key-value存储系统
可以用来存储字符串,哈希结构,链表,集合

安装

windows:https://github.com/microsoftarchive/redis/releases

mac\linux:http://www.redis.cn/

Redis 数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。

string(字符串)

字符串类型是Redis的最基本数据结构。
字符串类型的值实际可以为字符串,数字,二进制,但是值最大不能超过512M。

key value
hello world
counter 1
bits 10000100
json {"id":1,"name":"xiaocai","age":18}

string命令

设置

set key value [EX seconds] [PX milliseconds] [NX|XX]

get key

> set name xiaocai
OK
> get name
"xiaocai"

过期

setex key seconds value

> set name1 redis1 ex 10 #10秒后过期
OK
> get name1
(nil)

> setex name2 10 redis2 #10秒后过期
OK
> get name2
"redis2"
> get name2
(nil)

> set name3 redis3 px 10 #10豪秒后过期
OK
> get name3
(nil)

不存在才能设置成功或者必须存在才能设置成功

> set hello world nx #不存在才能设置成功
OK
> set hello w nx #存在就设置失败
(nil)
> get hello
"world"

>set hello w xx  #存在才能设置成功
OK
> set world hello xx #不存在就设置失败
(nil)
> get hello
"w"
> get world
(nil)

批量设置

mset key value [key value ...]
mget key [key ...]

> mset name1 redis1 name2 redis2
OK

> mget name1 name2
1) "redis1"
2) "redis2"

> mget name1 name2 name3
1) "redis1"
2) "redis2"
3) (nil)

计数

incr key

incrby key increment

> set age 18  #value只能为整数
OK
> incr age
(integer) 19
> incrby age -5
(integer) 14
> incrby age 10
(integer) 24

删除

del key [key ...]

> del age
(integer) 1
> get age
(nil)

内部编码

  1. int 8个字节的长整型
  2. embstr 小于等于39个字节的字符串
  3. raw 大于39个字节的字符串
> set port 6379
OK
> object encoding port
"int"

> set hello world
OK
> object encoding hello
"embstr"

> set longString abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
OK
> object encoding hello
"raw"
> strlen longString
(integer) 52

list(列表)

list类型是用来存储多个有序的字符串。每列字符串称之为元素。一个list的最大存储为2^32-1个元素。可以对列表进行双端插入和弹出,也可以指定索引下标获取元素。

list命令

头部和尾部添加元素

lpush key value [value ...]

rpush key value [value ...]

lrange key start stop

> lpush letter "a"
(integer) 1
> lpush letter "b"
(integer) 2
> lpush letter "c"
(integer) 3
> lrange letter 0 -1
1) "c"
2) "b"
3) "a"

> rpush letter "a"
(integer) 4
> rpush letter "b"
(integer) 5
> rpush letter "c"
> lrange letter 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
5) "b"
6) "c"

头部和尾部弹出元素

lpop key

rpop key

> lpop letter
"c"
> lpop letter
"b"
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
4) "c"

> rpop letter
"c"
> rpop letter
"b"
> lrange letter 0 -1
1) "a"
2) "a"

索引操作
索引需要对全部list进行遍历,性能会随着元素个数的增大而变差

lrange key start stop

lindex key index

ltrim key start stop

len key

> rpush letter b c
(integer) 4
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
4) "c"
> lindex letter 2
"b"
> ltrim letter 0 -2
OK
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
> llen letter
(integer) 3

插入

insert key BEFORE|AFTER pivot value

> linsert letter before b c
(integer) 4
> linsert letter after a d
(integer) 5
> lrange letter 0 -1
1) "a"
2) "d"
3) "a"
4) "c"
5) "b"

修改

set key index value

> lset letter 2 B
OK
> lrange letter 0 -1
1) "a"
2) "d"
3) "B"
4) "c"
5) "b"

内部编码

  1. ziplist(压缩列表):小于3.2版本,当元素个数小于list-max-ziplist-entries配置(默认512个),同时每个元素的值长度都小于list-max-ziplist-value配置(默认64字节)
  2. linkedlist(链表):小于3.2版本,不满足ziplist的条件
  3. quicklist:Redis 3.2版本,以一个ziplist为节点的linkedlist
> object encoding letter
"quicklist"

hash (哈希)

hash是一个string类型的field和value的映射表。 它适合用于存储对象,它是无序的,不能使用索引操作。

hash命令

设置

hset key field value

> hset user:1 name zhangSan
(integer) 1
> hset user:1 age 18
(integer) 1

获取和获取所有的field-value

hget key field

hgetall key

> hget user:1 name
"zhangSan"
> hgetall user:1
1) "name"
2) "zhangSan"
3) "age"
4) "18"

删除

hdel key field [field ...]

> hdel user:1 age
(integer) 1
> hdel user:2 age
(integer) 0

长度

hlen key

> hlen user:1
(integer) 1

批量设置

hmset key field value [field value ...]

> hmset user:2 name liSi age 23
OK
> hmget user:2 name age
1) "liSi"
2) "23"
> hlen user:1
(integer) 1
> hlen user:2
(integer) 2

是否存在

hexists key field

> hexists user:2 name
(integer) 1
> hexists user:2 city
(integer) 0

所有的field和所有的value

hkeys key

hvals key

> hkeys user:1
1) "name"
> hkeys user:2
1) "name"
2) "age"
> hvals user:1
1) "zhangSan"
> hvals user:2
1) "liSi"

内部编码

  1. ziplist(压缩列表):当元素个数小于hash-max-ziplist-entries配置(默认512个)和每个元素大小小于hash-max-ziplist-value配置(默认64字节)时
  2. hashtable(哈希表):不满足ziplist条件时
> object encoding user:1
"ziplist"

修改配置文件hash-max-ziplist-entries为5

> hmset test t1 v1 t2 v2 t3 v3 t4 v4 t5 v5 t6 v6
OK
> object encoding test
"hashtable"

set(集合)

用来保存多个字符串元素,无序的,不能有重复元素,不能使用索引下标获取元素。一个集合可以存储2^32-1个元素。

set命令

增加

add key member [member ...]

> sadd user:1:tag it music news
(integer) 3
> sadd user:1:tag bike news
(integer) 1

删除

srem key member [member ...]

> srem user:1:tag bike
(integer) 1

个数

scard key

> scard user:1:tag
(integer) 3

是否存在

sismember key member

> sismember user:1:tag bike
(integer) 0
> sismember user:1:tag it
(integer) 1

随机返回指定个数

srandmember key [count]

> srandmember user:1:tag
"news"
> srandmember user:1:tag 3
1) "news"
2) "music"
3) "it"

随机弹出

spop key [count]

> spop user:1:tag
"news"
> srandmember user:1:tag 3
1) "music"
2) "it"

所有个数

smembers key

> smembers user:1:tag
1) "music"
2) "it"

交集

sinter key [key ...]

> sinter user:1:tag user:2:tag
1) "music"
2) "it"

并集

sunion key [key ...]

> sunion user:1:tag user:2:tag
1) "music"
2) "java"
3) "run"
4) "it"

差集

sdiff key [key ...]

> sdiff user:1:tag user:2:tag
(empty list or set)
> sadd user:1:tag sleep
(integer) 1
> sdiff user:1:tag user:2:tag
1) "sleep"
> sdiff user:2:tag user:1:tag
1) "java"
2) "run"

内部编码

  1. intset(整数集合):元素都是整数和元素个数小于set-max-intset-entries配置(默认512个)时
  2. hashtable(哈希表):不满足intset时
> object encoding user:1:tag
"hashtable"

> sadd numbers 1 2 3 4 5
(integer) 5
> object encoding numbers
"intset"

zset(有序集合)

zset保证了元素不能重复,每个元素都有一个分数(score)作为排序的依据。

zset命令

添加

zadd key [NX|XX] [CH] [INCR] score member [score member ...]

> zadd books 8.2 "Redis in Action"
(integer) 1
> zadd books 9.3 "Effective Java: Second Edition : Java"
(integer) 1
> zadd books 9.1 "Think in Java"
(integer) 1
> zadd books 9.3 "Python Cookbook" 9.0 "Effective Python"
(integer) 2

个数

zcard key

> zcard books
(integer) 5

升序返回范围的成员

zrange key start stop [WITHSCORES]

> zrange books 0 -1
1) "Redis in Action"
2) "Effective Python"
3) "Think in Java"
4) "Effective Java: Second Edition : Java"
5) "Python Cookbook"

> zrange books 2 5
1) "Think in Java"
2) "Effective Java: Second Edition : Java"
3) "Python Cookbook"

升序返回成员时带上分数

> zrange books 0 -1 withscores
 1) "Redis in Action"
 2) "8.1999999999999993"
 3) "Effective Python"
 4) "9"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Java: Second Edition : Java"
 8) "9.3000000000000007"
 9) "Python Cookbook"
10) "9.3000000000000007"

> zrange books 2 5 withscores
1) "Think in Java"
2) "9.0999999999999996"
3) "Effective Java: Second Edition : Java"
4) "9.3000000000000007"
5) "Python Cookbook"
6) "9.3000000000000007"
  1. 精度问题:内部 score 使用 double 类型进行存储,所以存在小数点精度问题
  2. withscores:带上分数

降序

zrevrange key start stop [WITHSCORES]

> zrevrange books 0 -1 withscores
 1) "Python Cookbook"
 2) "9.3000000000000007"
 3) "Effective Java: Second Edition : Java"
 4) "9.3000000000000007"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Python"
 8) "9"
 9) "Redis in Action"
10) "8.1999999999999993"

指定value的score

zscore key member

> zscore books "Think in Java"
"9.0999999999999996"

根据score的数值区间升序

zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

> zrangebyscore books 0 9.1 withscores
1) "Redis in Action"
2) "8.1999999999999993"
3) "Effective Python"
4) "9"
5) "Think in Java"
6) "9.0999999999999996"

根据score的数值区间降序

zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]

> zrevrangebyscore books 9.1 0  withscores
1) "Think in Java"
2) "9.0999999999999996"
3) "Effective Python"
4) "9"
5) "Redis in Action"
6) "8.1999999999999993"

根据score的数值降序输出所有元素

> zrevrangebyscore books +inf -inf  withscores
 1) "Python Cookbook"
 2) "9.3000000000000007"
 3) "Effective Java: Second Edition : Java"
 4) "9.3000000000000007"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Python"
 8) "9"
 9) "Redis in Action"
10) "8.1999999999999993"
  1. +inf 正无穷
  2. -inf 负无穷

删除

zrem key member [member ...]

> zrem books "Effective Java: Second Edition : Java"
(integer) 1

增加分数

zincrby key increment member

> zincrby books 2  "Redis in Action"
"10.199999999999999"
> zincrby books -1  "Redis in Action"
"9.1999999999999993"

交集

zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE

> zadd textbooks 8 "chinese" 9 "english" 9.5 "mathematics"
(integer) 3
> zadd textbooks 9.2 "Think in Java"
(integer) 1

> zrange books 0 -1
1) "Redis in Action"
2) "Effective Python"
3) "Think in Java"
4) "Python Cookbook"
> zrange textbooks 0 -1
1) "chinese"
2) "english"
3) "Think in Java"
4) "mathematics"

> zinterstore newbooks 2 books textbooks
(integer) 1
> zrange newbooks 0 -1
1) "Think in Java"

并集

zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE

> zunionstore newUnionbooks 2 books textbooks
(integer) 7
> zrange newUnionbooks 0 -1
1) "chinese"
2) "Redis in Action"
3) "Effective Python"
4) "english"
5) "Python Cookbook"
6) "mathematics"
7) "Think in Java"

内部编码

  1. ziplist(压缩列表):元素个数小于zset-max-ziplist-entries配置(默认128个)和元素长度小于zset-max-ziplist-value配置(默认64B)时
  2. skiplist(跳跃表):不满足ziplist时
> object encoding books
"ziplist"

结语

本人深知水平有限,欢迎指正本文错误之处。

参考资料

《Redis 实战》

《Redis 开发与运维》

《Redis 深度历险:核心原理与应用实践》

原文地址:https://www.cnblogs.com/imeng/p/11305235.html

时间: 2025-01-10 17:00:49

一文了解:Redis基础类型的相关文章

Redis学习笔记(2) Redis基础类型及命令之一

1. 基础命令 (1) 获取符合规则的键名列表 格式为:KEYS pattern 其中pattern表示支持通配符 # 建立一个名为bar的键 127.0.0.1:6379> SET bar 1 OK # 获取Redis所有键 127.0.0.1:6379> KEYS * 1) "bar" 注意:KEYS命令需要遍历Redis中所有键,因此当键的数量较多时会影响性能. (2) 判断一个键是否存在 格式为:EXISTS key 如果存在则返回1,否则返回0. 127.0.0.

Redis学习笔记(3) Redis基础类型及命令之二

1. 集合类型 集合类型与列表类型有很多相似之处,但二者的区别在于:前者具有唯一性,但不具有有序性:后者具有有序性,但不具有唯一性.集合类型的常用操作是向集合中加入或删除元素.判断某个元素是否存在等,以及多个集合类型之间进行并集.交集和差集运算. (1) 命令 1) 增加/删除元素 格式为:SADD key member [member ...] SREM key member [member ...] SADD向集合中增加一个或多个元素,加入的元素若已存在语集合中,则会忽略该元素.命令返回成功

使用 redis (基础, key操作, string类型操作)

使用redis set 类型: 没有重复元素 list 链表类型 有重复累型 sort set 类型 没有重复元素 1.1 存储数据 读取数据 // 数据储存在 内存中 set name laowen // OK 表示成功 set age 22    // ok 表示成功 set add beijing // OK 表示成功 get name // "laowen" 表示获取成功 get age // "22" 表示获取成功 get addr // "be

自学HIBERNATE5.0文档第一季之基础类型篇

2.3. Basic Types Basic value types usually map a single database column, to a single, non-aggregated Java type. Hibernate provides a number of built-in basic types, which follow the natural mappings recommended by the JDBC specifications. Internally

REDIS基础笔记

Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布/订阅模式 Python中使用Redis 实际实例 管理 其他 资源链接 推荐书籍:<Redis入门指南> 资源列表: redis命令速查command | CMD索引-中文 | CMD树-中文 redis源码github 下载地址redis.io The Little Redis book 入口

redis 五大类型 、持久化方式以及主从(哨兵模式)

一.redis 五大类型: redis 键 keys * exists key的名字,判断某个key 是否存在 move key db 当前数据库就没有了,被移除了 ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期 type key 看看你的key是什么类型redis 字符串 set.get .del.append.strlen incr.decr .incrby. decrby getrange.setrange setex(set with expire)键秒值.setn

linux redis基础应用 主从服务器配置

Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memcached相比,它支持存储的value类型相对更多,包括strings,lists,zsets(sorted set)和hashesredis会周期性的吧更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实现了master-slave(主从)同步 redis服务器服务器程序:redis

Redis 基础应用

Redis 基础应用(一) ============================================================================== 概述: ============================================================================== Redis简介  1.简介 ★Redis REmote DIctionary Server(Redis) 是一个由Salvatore Sanfili

笔记一 Redis基础

在cmd 命令中运行redis 运行redis命令 :redis-cli Reids数据结构初探  数据结构有五种 string(字符串). list(列表).set(集合).hash(散列).zset(有序集合) redis各类型的简单介绍 和最基础的命令   1.string(字符串) 字符串类型:就是存储一个值吗  存储的数据可以是 string 也可以是 int 之列的类型 可以通过 get ; set ; del 来对string类型进行添加 读取 删除: 2.list(列表) 就是一