Redis深度历险(2)-基本操作

本文详细介绍了Redis中的五种数据类型:string(字符串)、hash(哈希)、list(链表)、set(无序不重复集合)及zset(有序不重复集合)。针对每种类型都列举了常用的操作命令,并解释了它们的底层实现原理。

目录

一、Redis的数据存储类型

二、string常用操作

     1、set key value

     2 、get key

     3、getset key value

     4、incr key

     5、decr key

     6、incrby key number

     7、decrby key number

     8、append key v

     9、del key

     10、keys *

三、hash常用操作

1、hset key field value

2、hgetall key

3、hget key field

4、hmset key fields

5、hmget key fileds

6、hexists key field

7、hlen key

8、hdel key

9、hkeys key

10、hlen key

11、hincrby key field increment

四、list常用操作

1、实现右进左出队列

rpush java python go

lpop

2、实现右进右出栈

rpush java python go

rpop

3、返回list长度

llen listName

4、获取特定位置的内容

lindex listName number

5、获取范围内所有内容

lrange listName beginIndex endIndex

6、截取范围内内容

ltrim beginIndex endIndex

五、set常用操作

1、添加元素 

sadd  filed key

2、获取全部元素

smembers filed

3、查询是否存在

sismember field key

4、获取长度

scard filed

5、弹出元素

spop filed

2.补充:数据类型底层实现

1.string、list、hash、set、zset的底层数据结构

2.string的扩容操作

3.hash的拉链法、渐进式rehash、双hashtable

4.zset为什么采用跳表作为底层实现



一、Redis的数据存储类型

   Redis一共有5种数据类型,分别是string(字符串),hash(哈希),list(链表),set(无序不重复集合),zset(有序不重复集合)

 

二、string常用操作

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这 便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。 在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

     1、set key value

设 定key持有指定的字符串value,如果该key存在则进行覆盖 操作。总是返回”OK”

     2 、get key

获取key的value。如果与该key关联的value不是String类型,redis 将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返 回null。

     3getset key value

先获取该key的值,然后在设置该key的值。

     4、incr key

将该key的value值自增1,如果这个key不存在就会创建一个值为“1”的key,如果该key的值经过转换后不是数字,那么会报错

     5、decr key

key的value值自减1

     6、incrby key number

key的value值增长number

     7、decrby key number

key的value值减少number

     8、append key v

key的value值后面附加上v,相当于两字符串拼接

     9、del key

删除某个key

     10、keys *

查看所有key

三、hash常用操作

Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所 以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果 Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash 可以存储4294967295个键值对。

1、hset key field value

为指定的key设定field/value对(键值对)。

 

2、hgetall key

获取key中的所有filed-vaule

3、hget key field

返回指定的key中的field的值

4、hmset key fields

设置key中的多个filed/value

5、hmget key fileds

获取key中的多个filed的值

6、hexists key field

判断指定的key中的filed是否存在

7、hlen key

获取key所包含的field的数量

8、hdel key

删除某个key

9、hkeys key

查看某个key

10、hlen key

获取key所包含的field的数量

11、hincrby key field increment

设置key中filed的值增加increment,如:age 增加20

 

四、list常用操作

1、实现右进左出队列

rpush java python go

lpop

2、实现右进右出栈

rpush java python go

rpop

3、返回list长度

llen listName

4、获取特定位置的内容

lindex listName number

5、获取范围内所有内容

lrange listName beginIndex endIndex

6、截取范围内内容

ltrim beginIndex endIndex

 

五、set常用操作

1、添加元素 

sadd  filed key

2、获取全部元素

smembers filed

3、查询是否存在

sismember field key

4、获取长度

scard filed

5、弹出元素

spop filed

 

 

六、补充:数据类型底层实现

1.string、list、hash、set、zset的底层数据结构

1.string的底层基于字节数组(长度以范型T修饰,可被初始化为byte或short,以节约空间),其字符串的大小是可变的,类似于Java中的ArrayList
2.list的底层是一个双线链表,类似Java中的LinkedList
3.hash的底层是数组+链表,采用拉链法解决冲突,类似Java中的HashMap
4.set的底层是hash,set的值即为hash的key,所以不能重复
5.zset的底层是跳表

2.string的扩容操作

string会在创建时分配一个最大容量capacity,当当前数量len要大于capacity时,会进行扩容操作:
1.当字符串大小 < 1MB 时,每次成倍扩容
2.当字符串大小 >= 1MB 时,每次以1MB为增量扩容,最大不能超过512M
(为了节约空间,字符串大小不同时会采用不同的格式存储)

3.hash的拉链法、渐进式rehash、双hashtable

hash的设计十分巧妙,它在扩容时,不像HashMap那样全量rehash,将所有的index重新计算哈希值和新索引值放入新数组中,而是通过渐进式rehash来达到性能优化的目的:在hash结构中存在两个haashtable,一个是旧的,一个是新的。在发生扩容时,会先将一部分rehash到新是hashtable中,而其他部分仍保留在旧hashtable中,剩余的数据将被定时器转移或在之后的操作中再逐步将其转移到新的哈希表。

4.zset为什么采用跳表作为底层实现

因为zset必须保证有序,那么有两种方案,第一种是采用有序数组,这种方案能够用二分法做到插入有序,但是考虑到需要动态扩展大小,所以不能使用数组;第二种是采用有序链表,可以动态扩展大小,但是不能够快速地找到插入点;第三种是采用跳表,它结合来有序数组快速找到插入点的优点和链表动态扩展的优点,做到来O(logn)时间复杂度即可插入数据并且使其有序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值