Redis学习笔记

一,Redis基础知识

1,默认16个数据库,默认使用第0个,不同的数据库可以存储不同的值

​		select:切换数据库

​		dbsize:查看数据库大小

​		key*:查看数据库所有的键

​		flushdb:清空数据库一个

​		flushall:清除全部数据库内容

redis的瓶颈是根据机器内存

2.误区:

​ 1:高性能的一定是多线程的

​ 2:多线程一定比单线程快

3.核心:

​ redis快的原因是redis将所有的数据存储到内存中,

​ 对于内存系统来说,没有上下文切换

4.基本命令:

​ 设置过期时间:expire key time

​ 查看数据类型:type

二,String类型的主要指令和方法

​ append:追加字符串 append name “String”,如果数据不存在相当于新建

​ strlen:字符串长度,

127.0.0.1:6379> get name
"liujing"
127.0.0.1:6379> get name
"liujing"
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
"liujing"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name
none
127.0.0.1:6379> set name liujing
OK
127.0.0.1:6379> type name
string
127.0.0.1:6379> append name "hewhs"
(integer) 12
127.0.0.1:6379> get name
"liujinghewhs"
127.0.0.1:6379> strlen name
(integer) 12
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views 	#自减1
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379>incr views  #自增1
#############################################
步长的概念

127.0.0.1:6379> incrby views 10  #设置自增的长度+=i
(integer) 10
127.0.0.1:6379> get views
"10"
####################################
字符串范围截取
127.0.0.1:6379> set str 123456789
OK
127.0.0.1:6379> getrange str 0 2
"123"
##############################
替换部分字符串 setrange String键 起始位置 替换的字符串
127.0.0.1:6379> setrange str 0 987
(integer) 9
127.0.0.1:6379> get str
"987456789"
################################
setex(set with expire) #设置过期时间
setnx(set if exist) #如果不存在时才能设置成功

127.0.0.1:6379> setex k1 5 123
OK
127.0.0.1:6379> get k1
"123"
127.0.0.1:6379> get k1
(nil)
#############################
批量插入删除 mset mget

127.0.0.1:6379> mset k2 k2 k3 k3
OK
127.0.0.1:6379> get k2
"k2"
127.0.0.1:6379> getk3
(error) ERR unknown command `getk3`, with args beginning with:
127.0.0.1:6379> get k3
"k3"
127.0.0.1:6379> mget k2 k3
1) "k2"
2) "k3"
###############################
msetnx 是一个原子性操作,可以当作分布式锁来使用
127.0.0.1:6379> msetnx k1 k1 k4 k4
(integer) 1
127.0.0.1:6379> msetnx k1 k1 k4 k4
(integer) 0
127.0.0.1:6379> msetnx k1 k1 k5 k5
(integer) 0
127.0.0.1:6379>
#####################################
getset先get后set存在获取原来的值然后换成新的值,如果不存在返回null
127.0.0.1:6379> getset k1 kk1
"k1"
127.0.0.1:6379> get k1
"kk1"
#########################################
使用场景:
计数器,统计数量,

三,List,列表,当成栈,队列

所有的list命令用l开头
##################################
lpush key value1 value2 ...创建list,从左侧插入
lrange key start end    输出list里的值  
lrange key 0 -1 输出所有的values
rpush key value1 value2   插入从右侧开始
127.0.0.1:6379> lpush l1 qv1 v2 v3
(integer) 3
127.0.0.1:6379> lrange l1 0 2
1) "v3"
2) "v2"
3) "qv1"
127.0.0.1:6379> rpush r1 r2
(integer) 1
127.0.0.1:6379> rpush l1 r1 r2 r3
(integer) 8
#################################
移除value
lpop key左边移除
rpop key右边移除
lpop key 0 -1移除全部
##############################
通过下标获取值lindex
127.0.0.1:6379> lindex l1 0
"v4"
##############################
llen key 获取list的长度
127.0.0.1:6379> llen l1
(integer) 7
#########################
移除指定的值:lrem
127.0.0.1:6379> lrem l1 1 v2
(integer) 1
127.0.0.1:6379> lrange l1 0 -1
1) "v4"
2) "v3"
3) "qv1"
4) "r1"
5) "r2"
6) "r3"
#############################################
保留某一部分的元素:ltrim 
###########################################
rpoplpush #移除列表的最后一个元素,然后将他放在新的元素
###########################
判断列表是否存在:exists
127.0.0.1:6379> exists l1
(integer) 1
127.0.0.1:6379> exists l1 l2
(integer) 1
127.0.0.1:6379> exists l2
(integer) 0
127.0.0.1:6379> lpush l2 v2 v2 v2
(integer) 3
127.0.0.1:6379> exists l1 l2
(integer) 2
###########################################
更新列表中指定下标的元素:lset  如果下标位置不存在报错
127.0.0.1:6379> lset l2 0 newvalue1
OK
127.0.0.1:6379> lrange l2 0 -1
1) "newvalue1"
2) "v2"
3) "v2"
########################################
在列表中插入一些值:linsert
127.0.0.1:6379> linsert l1 before v4 vvvvvv4
(integer) 3
127.0.0.1:6379> lrange l1 0 -1
1) "vvvvvv4"
2) "v4"
3) "v3"

四,Set的基本命令

集合,set中的值不能重复

添加显示
127.0.0.1:6379> sadd set1 set1 set2 set3	#添加元素
(integer) 3
127.0.0.1:6379> smembers set1	#显示所有元素
1) "set1"
2) "set2"
3) "set3"
127.0.0.1:6379> sismember set1 set1	#判断该元素是否存在set中
(integer) 1
127.0.0.1:6379> scard set1	#获取set集合中的元素个数
(integer) 3
127.0.0.1:6379> srem set1 set1	#移除set集合中的元素
(integer) 1
127.0.0.1:6379> smembers set1
1) "set2"
2) "set3"
####################################################
从set中随机筛选出几个元素
127.0.0.1:6379> srandmember set1 2
1) "set5"
2) "set1"
127.0.0.1:6379> srandmember set1 2
1) "set5"
2) "set1"
127.0.0.1:6379> srandmember set1 2
1) "set4"
2) "set3"
127.0.0.1:6379> srandmember set1 2
1) "set5"
2) "set1"
127.0.0.1:6379> srandmember set1 2
1) "set5"
2) "set1"
127.0.0.1:6379> srandmember set1 2
1) "set5"
2) "set4"
##########################
删除指定的key,随机删除
127.0.0.1:6379> spop set1	#随机删除一个set中的元素
"set4"
##########################3
127.0.0.1:6379> sadd set1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd set2 1 2
(integer) 2
127.0.0.1:6379> smove set1 set2 3	#将一个set中的一个元素放在另外一个集合中
(integer) 1
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "4"
##########################
差集sdiff set1 set2
交集sinter set1 set2
并集sunion set1 set2

五,hash哈希,map集合

127.0.0.1:6379> hset myhash name liujing	#创建并且放入键值对
(integer) 1
127.0.0.1:6379> hset myhash age 13
(integer) 1
127.0.0.1:6379> hget myhash name	#取出键对应的值
"liujing"
127.0.0.1:6379> hmset myhash name lj age 12		#一次性放入多个键值对
OK
127.0.0.1:6379> hmget myhash name age	#一次性取出多个值
1) "lj"
2) "12"
127.0.0.1:6379> hgetall myhash		#获取所有的键值对
1) "name"
2) "lj"
3) "age"
4) "12"
5) "hmset"
6) "myhash"
127.0.0.1:6379> hdel myhash age		#删除元素key对应的value
(integer) 1
127.0.0.1:6379> hgetall myhash
2) "myhash"
127.0.0.1:6379> hlen myhash		#获取hash里面有多少个键值对
(integer) 4
127.0.0.1:6379> hgetall myhash
1) "hmset"
2) "myhash"
3) "name"
4) "liujing"
5) "age"
6) "13"
7) "height"
8) "175"
127.0.0.1:6379> hexists myhash name		#判断hash集合中是否存在于某一个元素
(integer) 1
127.0.0.1:6379> hexists mhash wo
(integer) 0
127.0.0.1:6379> hkeys myhash		#获取所有的key
1) "hmset"
2) "name"
3) "age"
4) "height"
127.0.0.1:6379> hvals myhash		#获取所有的value
1) "myhash"
2) "liujing"
3) "13"
4) "175"
127.0.0.1:6379> hget myhash age		
"13"
127.0.0.1:6379> hincrby myhash age 1		#设置hash里的某一个值自增
(integer) 14

应用:变更数据,user:name,age,height

六,Zset有序集合,在set的基础上

127.0.0.1:6379> zadd salary 100 a 300 b 200 c 50 d		#创建并且添加多个元素
(integer) 4
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf		#按照从大到小排序
1) "d"
2) "a"
3) "c"
4) "b"
127.0.0.1:6379> zrange salary 0 -1		#展示所有的元素
1) "d"
2) "a"
3) "c"
4) "b"
127.0.0.1:6379> zrem salary a		#删除一个元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> ZCARD salary		#获取集合中得元素个数
(integer) 3
127.0.0.1:6379> zcount myset 1 2			#获取在位数区间内的元素个数
(integer) 2

特殊得数据结构,地理位置详情,两地之间得距离,

geoadd	#添加经纬度
127.0.0.1:6379> GEOADD chine:city 116.28 39.55 beijing
(integer) 1

geopos	#显示经纬度
127.0.0.1:6379> GEOPOS chine:city beijing
1) 1) "116.28000229597091675"
   2) "39.5500007245470826"

geodist	#两个经纬度之间得距离
127.0.0.1:6379> GEOADD chine:city 126.63 45.75 haerbin
(integer) 1
127.0.0.1:6379> GEODIST chine:city beijing haerbin	#显示两城市间得距离
"1090453.8550"
127.0.0.1:6379> GEODIST chine:city beijing haerbin km
"1090.4539"
如果两个位置之间的其中一个不存在,那么命令返回空值。
指定单位的参数unit必须是以下单位的其中一个:
m表示单位为米
km表示单位为千米
mi表示单位为英里
ft表示单位为英尺
如果用户没有显式地指定单位参数,那么geodist默认使用米作为单位。
geodist命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误差。

georadius		#获取周围得地址
geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02  shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
#withdist 返回位置名称和中心距离
georadius cities:locations 117 39 200 km withdist
#withcoord 返回位置名称和经纬度
georadius cities:locations 117 39 200 km withcoord
#withdist withcoord 返回位置名称 距离 和经纬度
georadius cities:locations 117 39 200 km withdist withcoord

georadiusbymember
这个命令和georadius命令一样,都可以找出位于指定范围内的元素,但是georadiusbymember的中心点是由给定的位置元素决定的,
而不是像georadius那样,使用输入的经度和纬度来决定中心点

geohash
Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近

zrem

七,Redis的基本事务操作

​ mysql:acid 原子性,Redis单条命令是保证原子性的,但是Redis的事务不保证原子性。
​ 1,Redis事务的本质:一组命令的集合,一次性,排他性,顺序性
​ 2,Redis没有隔离级别的概念,所有命令在事务中,并没有直接执行,只有发起执行命令的时候才会执行
​ 3,redis的事务的步骤:
​ 开启事务:multi
​ 命令入队:
​ 执行事务:exec

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypG2d1df-1623059146231)(C:\Users\刘京\AppData\Roaming\Typora\typora-user-images\image-20210603175254029.png)]

​ 4,放弃事务:discard 一旦取消事务就会放弃所有的命令

​ 5,只要代码有问题就都不会执行,但是如果运行时有异常有异常的那条指令不会执行,其他的指令依旧会执行,所以Redis的事务没有原子性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRz0xinc-1623059146238)(C:\Users\刘京\AppData\Roaming\Typora\typora-user-images\image-20210604091946774.png)]

尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.youkuaiyun.com/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.youkuaiyun.com/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值