在1月17日-1月27日,本人花了11天学习redis这章内容,超过自己定的期限一周,期间遇到了很多bug,导致进度多次长时间停滞,大多最终都靠自己解决了。我将模拟回答几个问题,之后再分层次的详细讲述自己在学习中领悟的自己的理解,如果有错误,欢迎指正
1.什么是redis?
答:简单的说,redis是一用c语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库,缓存,消息中间件等场景,是一种Nosql的数据库
2.redis与mysql的区别?
答:2.1.redis是使用Nosql的数据库,而mysql是关系型数据库,它们的数据结构时不同的:Nosql通常以键值对的形式呈现,而sql使用表来组织数据
2.2性能:redis快一些
2.3使用场景:redis一般使用在缓存,消息队列,实时统计,而mysql通常用于复杂的查询和事务处理。
3.redis的优点
答:优秀的性能,数据是存储在内存中而不是磁盘中,所以读写速度快,而且Redis自带原子性,在事务中命令有一条有错,全部都不会执行,而且有高可拓展性,最后,作为存在内存中的数据,它能完成数据的持久化,也就是aof和rdb
接下来,我将分层次的叙述我的redis学习路线:
1.linux下载安装,redis下载安装,单机哨兵集群模原理掌握
1.1linux下载安装
1.1.1首先我是通过官网下载的vmware下载。看狂神通过360安装没有采用这个方式
1.1.2然后安装centos,我是通过清华镜像网站安装的,网址如下:清华大学开源软件镜像站 | Tsinghua Open Source Mirror
1.1.3VMware使用方式:点击屏幕进入虚拟机,crtl+alt鼠标退出虚拟机
1.2.Redis安装
1.2.1Redis官网下载安装包
1.2.2使用xshell连接linux,打开虚拟机,使用xftp把安装包传过去
1.2.3下载过程不作赘述,下载完成后创建 kconfig 目录来存放配置文件,修改配置文件demonize 改为yes,如果是no的话,它会输出所有输出和日志信息,但是关闭终端,Redis将退出
1.3单击哨兵集群模式
1.3.1单机模式:在单机模式下,Redis只在单个节点上运行,处理所有的读写请求和数据存储。
1.3.2哨兵模式:它通过引入一组Redis Sentinel进程来监控和管理Redis集群中的主节点和从节点,以实现自动故障恢复和故障转移。
1.3.3集群模式:redis-cluster它允许将多个Redis节点组成一个分布式集群,以便在处理大规模数据和并发负载时提供更好的性能和可用性。
其中哨兵集群的简单实现在我上篇文章有详细说明:1/27日学习笔记-CSDN博客
2.掌握五中常用数据类型:String,List,Set,Zset,Hash
通用:
set name qinjiang#设置name
DBSIZE#查看长度
keys *#查看所有
select 3#跳转数据库
flushdb#删除所有
type age#查看数据类型
EXPIRE age 10#设置key的过期时间
2.1String
incr view#增加
INCRBY view 10#自增步长
GETRANGE key1 0 3 #截取字符串【0,3】
GETRANGE key1 0 -1#获取全部的字符串和get key一样的
SETRANGE key1 1 xx#替换指定位置的字符串
setex key3 30 "hello"#设置key3的值为hello,30秒后过期
setnx mykey "redis"#如果mykey不存在,创建mykey'
setnx mykey "MongoDB"#如果mykey存在,创建失败
msetnx k1 v1 k4 v4#msetnx是一个原子性的操作,要么一起成功,要么一起失败
Getset #先get再set
127.0.0.1:6379> getset db redis#如果不存在值则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongoDB#如果存在值,获取原来的值并设置新的值
"redis"
127.0.0.1:6379> get db
"mongoDB"
2.2List
LPUSH list one #将一个值或者多个值,插入到列表头部(左)
Rpush list right #将一个值或多个值,插入到列表尾部
Lpop list#移除list的第一个元素
Rpop list#移除list的最后一个元素
Llen list #返回列表的长度
Rpoplpush #移除列表的最后一个元素,将它移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
##########################################
Lset 将列表中指定下标的值替换成为另外一个值,更新操作
127.0.0.1:6379> EXISTS list
(integer) 0
127.0.0.1:6379> lset list 0 item#如果不存在列表会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value1#如果存在,更新当前下标的值
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item
OK
##############################################
Linsert 将某个具体的value插入到列表中 某个元素的前面或者后面
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "world"
(integer) 2
127.0.0.1:6379> Linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> Lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> Linsert mylist after world new
(integer) 4
127.0.0.1:6379> Lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
2.3Set
Set中的值不能重复的!
#########################################
127.0.0.1:6379> sadd myset "hello" #
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查看指定set的所有值
1) "lovekuangshen"
2) "kuangshen"
3) "hello"
127.0.0.1:6379> SISMEMBER myset hello #判断一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 0
########################################
127.0.0.1:6379> scard myset #获取set集合中的内容的元素个数
(integer) 3
127.0.0.1:6379> srem myset hello#移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "lovekuangshen"
2) "kuangshen"
##########################################
127.0.0.1:6379> srandmember myset#随机抽选出一个元素
"lovekuangshen"
127.0.0.1:6379> srandmember myset
"lovekuangshen"
127.0.0.1:6379> srandmember myset
"lovekuangshen"
127.0.0.1:6379> srandmember myset
"kuangshen"
127.0.0.1:6379> srandmember myset 2 #随机抽选出指定数量的元素
1) "lovekuangshen"
2) "kuangshen"
###################################
随机删除key
127.0.0.1:6379> spop myset #随机删除元素
"lovekuangshen"
######################################
smove
127.0.0.1:6379> smove myset myset2 kaugnshen#讲一个指定的值移动到另外一个set集合
(integer) 1
127.0.0.1:6379> smembers myset2
1) "kaugnshen"
##################################################
127.0.0.1:6379> sinter keyl key2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sdiff keyl key2 #交集
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sunion keyl key2 #并集
1) "a"
2) "b"
3) "c"
4) "e"
5) "r"
6) "d"
2.4Zset
在set的基础上,增加一个值,set k1 v1 zset k1 score1 v1
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>
#############################################
排序如何实现
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 200 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf#从小到大显示
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores#带着分数显示全部
1) "kuangshen"
2) "200"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong #移除有序集合的指定元素
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> zcard salary #获取有序集合中的个数
(integer) 2
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhangsan"
2) "kuangshen"
127.0.0.1:6379> zadd myset 2 world 3 kangshen
(integer) 2
127.0.0.1:6379> zcout myset 1 3#获取指定区间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
2.5Hash
Set myhash
127.0.0.1:6379> hset myhash field1 kaugnshen #set 一个具体key-value
(integer) 1
127.0.0.1:6379> hget myhash field1
"kaugnshen"
127.0.0.1:6379> hmset myhash field1 hello field2 world #set 多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2 #获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部的数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> gdel myhash field1 #删除hash指定key字段!对应的value值也就消失了!
(error) ERR unknown command 'gdel', with args beginning with: 'myhash' 'field1'
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hlen myhash #获取hash表的字段数量
(integer) 1
127.0.0.1:6379> hexists myhash field1 #获取hash表中指定字段是否存在
(integer) 0
127.0.0.1:6379> hkeys myhash #只获取所有field
1) "field2"
127.0.0.1:6379> hvals myhash#只获得所有value
1) "world"
127.0.0.1:6379>
###############################################
Incr decr
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1 #指定增量
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello#如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world#如果存在则不能设置
(integer) 0
明天继续更新