linux下Redis基础

1.linux下启动redis并进入客户端

1.启动reids命令

//进入local目录
[root@zxf ~]#cd /usr/local
​
//在local目录下ll(查看目录文件) 
[root@zxf local]# ll
​
// 进入local目录下的bin目录
[root@zxf local]# cd ./bin
​
//打开bin目录中的redis-server文件并使用与bin目录同级的resdis6目录中的redis.conf文件
[root@zxf bin] redis-server ../redis6/redis.conf  
 

2.进入redis客户端命令

 //进入local下的bin目录
[root@zxf ~]# cd /usr/local/bin   
​
//打开bin目录中的redis-cli文件
[root@zxf bin]# redis-cli       

2.redis五大基本数据类型

  • string(字符串)

  • list(列表)

  • hash(字典)

  • set(集合)

  • zset(有序集合)

其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则:

  • create if not exists:容器不存在则创建

  • drop if no elements:如果容器中没有元素,则立即删除容器,释放内存

1.String

string(字符串)是Redis最简单也是使用最广泛的数据结构,它的内部是一个字符数组

指令:键值对增删改查操作

//不存在则新增,已存在则修改
set key value
​
//不存在则新增,已存在则不更新(修改失败)
setnx key value
​
//查询
get key
​
//删除指定的key (key可以是多个)
del key1 key2 ...

示例1: 新增查询,修改查询

127.0.0.1:6379> set nickname hh
OK
127.0.0.1:6379> get nickname
"hh"
127.0.0.1:6379> set nickname xx
OK
127.0.0.1:6379> get nickname 
"xx"

示例2: 按键删除键值对,返回受影响的行数

127.0.0.1:6379> del nickname
(integer) 1
127.0.0.1:6379> get nickname
(nil)

示例3:批量写入,批量读取,批量删除键值对

127.0.0.1:6379> mset nickname qqq age 18
OK
127.0.0.1:6379> mget nickname age
1) "qqq"
2) "18"
127.0.0.1:6379> del nickname age
(integer) 2
127.0.0.1:6379> mget nickname age
1) (nil)
2) (nil)

示例4: setnx -> 不存在创建,已存在则不更新

127.0.0.1:6379> get nickname
(nil)
127.0.0.1:6379> setnx niackname yyy
(integer) 1
127.0.0.1:6379> get niackname
"yyy"
127.0.0.1:6379> setnx niackname ooo
(integer) 0
127.0.0.1:6379> get niackname
"yyy"

指令:过期set命令

//设置一个缓存key的过期时间,使缓存到期后自动删除从而失效
expire key seconds

示例:

127.0.0.1:6379> set nickname wbd
OK
127.0.0.1:6379> get nickname
"wbd"
127.0.0.1:6379> expire nickname 5  #给键nickname设为5s过期
(integer) 1
127.0.0.1:6379> get nickname
(nil)

指令:自增命令

//前提是键值对的value必须是一个整数,且自增范围在signed long区间内
127.0.0.1:6379> incr num  #如果没有num这个键则创建,默认值为"0"
(integer) 1
127.0.0.1:6379> get num
"1"                       #自增后为"1"
127.0.0.1:6379> set money 100  
OK
127.0.0.1:6379> incr money
(integer) 101
127.0.0.1:6379> incrby money 99  #可以手动设置自增值
(integer) 200

2.list

key[value1,value2]

Redis的列表相当于Java语言中的LinkedList,它是一个双向链表数据结构支持前后顺序遍历。链表结构插入和删除操作快,查询慢。

list使用场景:

根据Redis双向列表的特性,因此其也被用于异步队列的使用。实际开发中将需要延后处理的任务结构体序列化成字符串,放入Redis的队列中,另一个线程从这个列表中获取数据进行后续处理

指令:右进左出——队列

队列在结构上是先进先出(FIFO)的数据结构(比如排队购票的顺序)

通过它可以确保元素的访问顺序。

//lpush->从左边添加元素
lpush key [value1 value2..]
​
//rpush->从右边添加元素
rpush key [value1 value2..]
​
//llen ->获取列表的长度
lleb key 
​
//lpop ->从左开始弹出元素
lpop key

示例:

127.0.0.1:6379> rpush country china usa jpan   #创建key为country的数组从右往左添加元素
(integer) 3
127.0.0.1:6379> llen country                   #查看数组长度
(integer) 3
127.0.0.1:6379> lpush country us               #向数组中从左往右添加一个元素
(integer) 4
127.0.0.1:6379> llen country                   #查看数组长度
(integer) 4
127.0.0.1:6379> lpop country                   #从左开始弹出元素
"us"
127.0.0.1:6379> lpop country
"china"
127.0.0.1:6379> lpop country
"usa"
127.0.0.1:6379> lpop country
"jpan"
127.0.0.1:6379> lpop country                   #数组中没有元素时弹出null
(nil)

指令:右进左出——队列

栈在结构上是先进后出(FILO)的数据结构(比如弹夹压入子弹,子弹被射击出去的顺序就是栈),这种数据结构一般用来逆序输出。

//lpush->从左边添加元素
lpush key value1 value2..
​
//rpush->从右边添加元素
rpush key value1 value2..
​
//rpop->从右开始弹出元素
rpop key

示例:

127.0.0.1:6379> rpush subject chinese Math english  #创建key为subject的数组从右往左添加元素
(integer) 3
127.0.0.1:6379> llen subject                        #查看数组长度
(integer) 3
127.0.0.1:6379> rpop subject                        #从右开始弹出元素
"english"
127.0.0.1:6379> rpop subject
"Math"
127.0.0.1:6379> rpop subject
"chinese"
127.0.0.1:6379> rpop subject                        #数组中没有元素时弹出null
(nil)

指令:慢操作

列表(list)是个链表数据结构,它的遍历是慢操作,所以涉及到遍历的性能将会遍历区间范围的增大而增大。list的索引运行为负数,-1代表倒数第一个,-2代表倒数第二个,其它同理

//lindex->遍历获取列表指定索引处的值
lindex key ind
​
//lrange->获取从索引start到stop处的全部值
lrange key start stop
​
//ltrim->截取索引start到stop处的全部值,其他将会被删除
ltrim key start stop

示例

127.0.0.1:6379> rpush nickname aaa bbb ccc ddd eee fff ggg    #创建key为nickname的数组
(integer) 7
127.0.0.1:6379> lindex nickname 0                             #获取索引为0的元素
"aaa"
127.0.0.1:6379> lindex nickname 1                             #获取索引为1的元素
"bbb"
127.0.0.1:6379> lindex nickname 2                             ...
"ccc"
127.0.0.1:6379> lindex nickname -1              #获取索引为-1的元素(即最后一位元素)
"ggg"
127.0.0.1:6379> lindex nickname -2              #获取索引为-2的元素(即倒数第二位元素)
"fff"
127.0.0.1:6379> lindex nickname -3              ...
"eee"
127.0.0.1:6379> lrange nickname 0 -1            #获取从索引0到索引-1处的全部元素
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"
5) "eee"
6) "fff"
7) "ggg"
127.0.0.1:6379> ltrim nickname 0 -2             #截取从索引0到索引-2处的全部元素,删除其他元素
OK
127.0.0.1:6379> lrange nickname 0 -1            #再次遍历数组,元素"ggg"已被删除
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"
5) "eee"
6) "fff"

3.hash(字典)

hash名称(key1 value1 key2 value2 key3 value3)

Redis的hash(字典)相当于Java语言中的HashMap,它是根据散列值分布的无序字典,内部的元素是通过键值对的方式存储

hash使用场景:

hash(字典)可以用来存储对象的相关信息,一个hash(字典)代表一个对象,hash的一个key代表对象的一个属性,key的值代表属性的值。hash(字典)结构相比字符串来说,它无需将整个对象进行序列化后进行存储。这样在获取的时候可以进行部分获取

指令:常用指令

//hash(字典)插入值,字典不存在则创建key代表字典名称,field相当于key,value是key的值
hset key field value
​
//hmset->批量设值
hmset key [field1 value1 field2 value2 ..] 

示例:

127.0.0.1:6379> hset book java "javaEE" #创建名为book的hashz字典,key为java,value为"javaEE"
(integer) 1
127.0.0.1:6379> hset book c "c"         #..
(integer) 1
127.0.0.1:6379> hset book php "php"     #..
(integer) 1 
127.0.0.1:6379> hmset book go "go" sql "sql"  #批量设值
OK

指令:

//hget->获取字典中指定key的value
hget key field
​
//hgetall->获取字典中所有的key和value并换行输出
hgetall key
​
//获取指定字典的key的个数
hlen key

示例

127.0.0.1:6379> hget book php           #查询键为php的value
"php"
127.0.0.1:6379> hget book java          #查询键为java的value
"javaEE"
127.0.0.1:6379> hgetall book            #查询book中所有的key和value并换行输出
 1) "java"
 2) "javaEE"
 3) "c"
 4) "c"
 5) "php"
 6) "php"
 7) "go"
 8) "go"
 9) "sql"
10) "sql"
127.0.0.1:6379> hlen book               #获取book中key的个数
(integer) 5

4.set(集合)

key [value1,value2,value3...]

Redis的set(集合)相当于Java语言里的HashSet,它内部的键值对是无序的、唯一的。它的内部实现了一个所有value为null的特殊字典。 集合中的最后一个元素被移除之后,数据结构被自动删除,内存被回收。

set的使用场景

set(集合)由于其特殊去重复的功能,我们可以用来存储活动中中奖的用户的ID,这样可以保证一个用户不会中奖两次。

指令:常用指令

//sadd->添加集合成员,key为集合名称,member值为集合元素,元素不能重复
sadd key [member1,member2...]
​
//smembers->查看集合中所有的元素,注意是无序的
smembers key
​
//sismember->查询集合中是否包含某个元素
sismember key member
​
//scard->获取集合的长度
scard key
​
//spop->弹出元素,count指弹出元素的个数
spop key[count]

示例:

127.0.0.1:6379> sadd name qqq www eee rrr      #创建名为name的set集合并插入4个元素
(integer) 4
127.0.0.1:6379> sadd name www                  #插入的元素和集合中某个元素相同则返回0(插入失败)
(integer) 0
127.0.0.1:6379> smembers name                  #查看集合中的所有元素,注意是无序的
1) "eee"
2) "rrr"
3) "www"
4) "qqq"
127.0.0.1:6379> sismember name eee             #查看set集合中是否包含"eee",有返回1,无返回0 
(integer) 1
127.0.0.1:6379> sismember name eeee
(integer) 0
127.0.0.1:6379> scard name                     #获取集合的长度
(integer) 4
127.0.0.1:6379> spop name 2                    #弹出2个元素
1) "rrr"
2) "eee"
127.0.0.1:6379> spop name 4                    #弹出4个元素,但集合中只剩2个元素了
1) "www"
2) "qqq"
127.0.0.1:6379> spop name 1                    #弹出1个元素,没有则返回null
(empty array)

5.zset(有序集合)

zset(有序集合)是Redis中最常问的数据结构。它类似于Java语言中的SortedSet和HashMap的结合体,它一方面通过set来保证内部value值的唯一性,另一方面通过value的score(权重)来进行排序。这个排序的功能是通过Skip List(跳跃列表)来实现的。 zset(有序集合)的最后一个元素value被移除后,数据结构被自动删除,内存被回收。

zset使用场景

  • 存储粉丝列表,value是粉丝的ID,score是关注时间戳,这样可以对粉丝关注进行排序

  • 存储学生成绩,value是学生的ID,score是学生的成绩,这样可以对学生的成绩排名

常用指令

//zadd ->向集合中添加元素,集合不存在则新建,key代表zset集合名称,score代表元素权重,member代表元素
zadd key [score1 member1 score2 member2 ...]
​
//zrange ->按照score权重从小到大排序输出集合中的元素,权重相同则按照value的字典顺序排序
zrange key start stop[WITHSCORES]
​
//zrevrange ->按照score权重从大到小排序输出集合中的元素,权重相同则按照value的字典逆序排序
zrevrange key start stop[WITHSCORES]
​
//zcard->当key存在且是有序集合类型时,返回有序集合的基数。当key不存在时返回0
zcard key
​
//zscore->返回有序集合key中成员member的score值,若member元素不是有序集合key的成员,或key不存在返回nil
zscore key member z
​
//zrank ->返回有序集合key中成员member的排名,其中有序集合按score值递增(从小到大)顺序排列
zrank key member
​
//zrangebyscore -> 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
​
//zrem -> 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略
zrem key member [member …]

示例:

127.0.0.1:6379> zadd name 10 qqq 10.1 www 9.9 aaa   #新建名为name的set集合并设置权重
(integer) 3
127.0.0.1:6379> zrange name 0 -1                    #按权重从小到大遍历集合
1) "aaa"
2) "qqq"
3) "www"
127.0.0.1:6379> zrevrange name 0 -1                 #按权重从大到小遍历集合
1) "www"
2) "qqq"
3) "aaa"
127.0.0.1:6379> zcard name                          #返回集合长度
(integer) 3
127.0.0.1:6379> zscore name www                     #判断元素是否存在集合中,有返回1,没有返回nil
"10.1"
127.0.0.1:6379> zscore name jjj
(nil)
127.0.0.1:6379> zrange name 0 -1                    
1) "aaa"
2) "qqq"
3) "www"
127.0.0.1:6379> zrank name aaa                      #返回元素排名,score值最小的排名为0
(integer) 0
127.0.0.1:6379> zrangebyscore name 9 10             #返回权重值从9到10的元素
1) "aaa"
2) "qqq"
127.0.0.1:6379> zrangebyscore name 9 10 WITHSCORES  #返回权重值从9到10的元素及元素的权重值
1) "aaa"
2) "9.9000000000000004"
3) "qqq"
4) "10"
127.0.0.1:6379> zrangebyscore name 10 11            #返回权重值从10到11的元素
1) "qqq"
2) "www"

参考原文链接:要看就看最好,16万字全网最硬核redis总结,谁赞成,谁反对?(被粉丝疯狂催更,已有人反馈看完专栏拿到大厂offer!!!)_Java框架、并发编程、分布式、微服务、Redis、HarmonyOS、中间件等技术-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值