Redis常用的数据类型

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

概述

Redis是一个开源的key-value存储系统和Memcached类似它支持存储的value类型相对更多包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash哈希类型为了保证效率数据都是缓存在内存中。Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实现了master-slave(主从)同步。

Redis是单线程+多路IO复用技术。

多路复用是指使用一个线程来检查多个文件描述符Socket的就绪状态比如调用select和poll函数传入多个文件描述符如果有一个文件描述符就绪则返回否则阻塞直到超时。

安装

https://blog.csdn.net/zhiwenganyong/article/details/125569173?spm=1001.2014.3001.5502

Redis启动

后台启动

  1. 拷贝一份redis.conf到其它目录

  1. 修改etc目录下的redis.conff(247行)文件将里面的daemonize no 改成 daemonize yes让服务在后台启动

  1. 切换到/usr/local/bin,使用启动命令redis-server /etc/redis.conf

  1. 查看关于redis线程状态

ps -ef|grep redis

前台启动

使用命令redis-server

redis-server

客户端访问redis

redis-cli
ping #使用ping查看链接状态
shutdown #关闭redis,使用命令shutdown
多实例关闭指定端口关闭redis-cli -p 6379 shutdown
也可以通过杀进程关闭kill -9 进程号

常用的数据类型

键(key)操作

keys * #查看当前库所有key
exists key #判断某个key是否存在,例如 exists k1 (k1是否存在)
type key #查看你的key是什么类型,例如 type k1 (查看k1的类型)
del key #删除指定的key数据,例如 del k1 (删除k1的数据)
unlink key #根据value选择非阻塞删除,仅将keys从keyspace元数据中删除(真正的删除会在后续异步操作根据value选择非阻塞删除 )
expire key 10 #10秒钟,为给定的key设置过期时间
ttl key #查看还有多少秒过期-1表示永不过期-2表示已过期
select #命令切换数据库,如: select 1
dbsize #查看当前数据库的key的数量
flushdb #清空当前库
flushall #通杀全部库

字符串String

String是Redis最基本的类型一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据比如jpg图片或者序列化的对象。String类型是Redis最基本的数据类型一个Redis中字符串value最多可以是512M

String的相关命令

set <key> <value> #添加键值对
get <key> #查看对应键值
append <key> <value> #追加到原值的末尾
strlen <key> #获得值的长度
setnx <key> <value> #只有 key 不存在时才加入该 key 的值
incr <key> #将 key 中储存的数字值增 1只能对数字值操作如果为空新增值为 1
decr <key> #将 key 中储存的数字值减 1只能对数字值操作如果为空新增值为 -1
incrby / decrby <key> <步长> #将 key 中储存的数字值增减。自定义步长
mset <key1> <value> <key2> <value2> ...... #设置一个或者多个 key-value 键值对
mget <key1> <key2> ...... #获取一个或者多个 key-value 键值对
msetnx <key1> <value> <key2> <value2> ...... #同时设置一个或多个 key-value 对当且仅当所有给定 key 都不存在,如果有一个存在就不会成功
getrange <key> <起始位置> <结束位置> #获得值的范围前包后包类似 java 中的 substring
setrange <key> <位置> <newValue> #设置指定区间范围内的值,用<value> 覆写<key>所储存的字符串值从<起始位置>开始(索引从0开始)
setex <key> <过期时间/秒> <value> #设置键值的同时设置过期时间单位秒
psetex <key> <过时间/毫秒> <value> #设置键值的同时设置过期时间单位毫秒
getset <key> <value> #以新换旧设置了新值同时获得旧值
自增自减操作具有原子性所谓原子操作是指不会被线程调度机制打断的操作
这种操作一旦开始就一直运行到结束中间不会有任何 切换到另一个线程。
存储对象可以存储json数据。

列表List

Redis 列表List是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边特点是单键多值底层实际是个双向链表对两端的操作性能很高通过索引下标的操作中间的节点性能会较差。

List相关命令

lpush/rpush <key> <value1> <value2> <value3> ... #从左边 / 右边插入一个或多个值左右也就是首尾
lrange <key> <start> <stop> #按照索引下标获得元素(从左到右先进后出)
lrange <key> 0 -1 #如果 start 是 0stop 是 -1代表获取所有元素
lpop/rpop <key> #从左边 / 右边吐出一个值。吐出后该值就不存在 key 中
lindex <key> <index> #按照索引下标获得元素(从左到右)-1 代表最后一个0 代表是第一个
llen <key> #获得列表长度
linsert <key> before/after <value> <newValue> #在元素某个值的前面 / 后面插入新值如果 value 有多个则插入最前面的那个
lrem <key> <n> <value> #从左边删除 n 个 value(从左到右)如果有多个一样的 lement则删除列表最前面的的
lset <key> <index> <value> #将列表 key 下标为 index 的值替换成 value
List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储这个结构是ziplist也即是压缩列表。它将所有的元素紧挨着一起存储分配的是一块连续的内存。
当数据量比较多的时候才会改成quicklist。

集合Set

Redis set对外提供的功能与list类似是一个列表的功能特殊之处在于set是可以自动排重的当你需要存储一个列表数据又不希望出现重复数据时set是一个很好的选择并且set提供了判断某个成员是否在一个set集合内的重要接口这个也是list所不能提供的。

Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表所以添加删除查找的复杂度都是O(1)。

Set相关命令

sadd <key> <value1> <value2> ... #将一个或多个 member 元素加入到集合 key 中已经存在的 member 元素将被忽略
smembers <key> #取出该集合的所有值
sismember <key> <value> #判断集合是否为含有该值有 1没有 0
scard <key> #返回该集合的元素个数
srem <key> <value1> <value2> ... #删除集合中的某个元素
spop <key> #随机从该集合中吐出一个值key 里就没有该值了
srandmember <key> <n> #随机从该集合中取出 n 个值。不会从集合中删除
smove <key1> <key2> <value> #把集合中一个值从一个集合移动到另一个集合其中 key1 为要获取的集合key2 为放入的集合
sinter <key1> <key2> #返回两个集合的交集元素
sunion <key1> <key2> #返回两个集合的并集元素
sdiff <key1> <key2> #返回两个集合的差集元素(key1 中的不包含 key2 中的)

哈希Hash

Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表hash特别适合用于存储对象类似Java里面的Map<String,Object>。

hash相关命令

hset <key> <field1> <value> <field2> <value> ... #给集合 key 的 filed 键赋值 value批量也可以4.0 之前是 hmset现在 hset 也可以批量添加
hget <key> <field> #从 key 集合取出 value
hexists <key> <field> #查看哈希表 key 中给定域 field 是否存在
hkeys <key> #列出该 hash 集合的所有 field
hvals <key> #列出该 hash 集合的所有 value
hincrby <key> <field> <increment> #为哈希表 key 中的域 field 的值加上增量
hsetnx <key> <filed> <value> #将哈希表 key 中的域 field 的值设置为 value 当且仅当域 field 不存在
Hash类型对应的数据结构是两种ziplist压缩列表hashtable哈希表。当field-value长度较短且个数较少时使用ziplist否则使用hashtable

有序集合Zset

Redis有序集合zset与普通集合set非常相似是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分score,这个评分score被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的但是评分可以是重复了 。因为元素是有序的, 所以你也可以很快的根据评分score或者次序position来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

zset相关命令

zadd <key> <score1> <value1> <score2> <value2> ... #将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zrange <key> <start> <stop> [withscores] #返回有序集 key 中下标在 star t和 stop 之间的元素
zrevrange <key> <start> <stop> [withscores] #同上改为从大到小排列
zrangebyscore <key> <min> <max> [withscores] [limit offset count] #返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 有序集成员按 score 值递增(从小到大)次序排列
zrevrangebyscore <key> <min> <max> [withscores] [limit offset count] #同上改为从大到小排列
zincrby <key> <increment> <value> #为元素的 score 加上增量
zrem <key> <value> #删除该集合下指定值的元素
zcount <key> <min> <max> #统计该集合分数区间内的元素个数
zrank <key> <value> #返回该值在集合中的排名从 0 开始
zrevrank <key> <value> #返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序

zset底层使用了两个数据结构

  • hashhash的作用就是关联元素value和权重score保障元素value的唯一性可以通过元素value找到相应的score值。

  • 跳跃表跳跃表的目的在于给元素value排序根据score的范围获取元素列表。

跳跃表(跳表)

有序集合在生活中比较常见例如根据成绩对学生排名根据得分对玩家排名等。对于有序集合的底层实现可以用数组、平衡树、链表等。数组不便元素的插入、删除平衡树或红黑树虽然效率高但结构复杂链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树实现远比红黑树简单。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis

“Redis常用的数据类型” 的相关文章