一,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)]