redis基础用法


前言

当前的技术环境下,太多的技术,让我们看的眼花缭乱。高速的开发工作下,我们似乎忘记的学习技术的本身,往往是为了解决问题的目的,而忘记了产生问题的原因,以及解决方法的底层。浮躁的我们,遵循了鲁迅先生说的“拿来主义”,解决完问题便抛之脑后,却忽视了知其然还要知其所以然的主旨。你说redis我们用过没,当然用过!会用吗?会还是不会,我却犹豫了。只做了简单的存和取,算是会了吗?为了解决这些问题,在这个快的年代里,我开始让自己慢起来,慢下来学习redis。从头进行学习理解。


一、redis是什么?

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
免费、开源,是当下热门的NoSql技术之一。
redis支持的语言

读每秒100000+ 写每秒80000+

二、redis的能干嘛?

内存储存、持久化,内存中是断电即失的,所以说持久化很重要(rdb,aof)
效率高,可用用于高速缓存
可以做发布订阅系统
地图信息分析
计时器、计数器 (点赞数、浏览量)

三、redis的特性

多数据结构
持久化
集群
支持事务

学习链接
redis官网
redis中文网

四、redis安装(linux环境)

1.下载安装包

官网下载安装包

2.上传到linux服务器,解压压缩包

[root@iZ2ze2nmkl044m4m0cgk5kZ opt]# tar -zxvf redis-6.0.8.tar.gz 

解压

3. 进入解压后的文件下,安装c环境

yum install gcc-c++  #安装c换件
make 				#将需要的文件编译起来
make install		#检查一下是否安装完成

将redis文件编译,生成src目录

4.配置文件

将 /opt/redis-6.0.8/redis-conf 文件备份到/usr./local下

[root] cp /opt/redis-6.0.8/redis.conf  /usr/local/bin/mconfig/

修改配置文件 daemonize 改为 yes

cd /usr/local/bin/mconfig
vim redis.conf

修改配置文件

5.启动服务

通指定的配置文件启动服务

redis-server mconfig/redis.conf

在这里插入图片描述

启动redis客户端启动服务

redis-cli -p 6379 	#启动客户端
keys *				#查询数据库0的所有key

查看redis 服务是否启动着

ps -ef | grep redis

在这里插入图片描述

关闭redis服务

redis-cli -p 6379	#链接到客户端
shutdown			#关闭服务

在这里插入图片描述

五、redis自带压测包 redis-benchmark

redis-benchmark 是redis自带的并发压测工具
#测试:100个并发 10000次请求

redis-server mconfig/redis.conf		#指定文件启动redis
redis-benchmark -h localhost -p 6379 -c 100 -n 10000   #100个并发 10000次请求

数据分析
在这里插入图片描述

六、redis五大数据类型

String类型

*字符串set值*
127.0.0.1:6379> set key1 'hello'   	#设置值
OK
127.0.0.1:6379> get key1			#获取值
"hello"
127.0.0.1:6379> APPEND key1 ' world'#往key1里追加值,append
(integer) 11						#返回字符长度
127.0.0.1:6379> get key1			#获取值
"hello world"			
127.0.0.1:6379> STRLEN key1			#strlen 获取值得长度
(integer) 11	
127.0.0.1:6379>keys *				#查询当前数据库中所有键
1) "key1"
127.0.0.1:6379> APPEND key 'xiaoye'	#往key里面追加值,如果这个键不存在,则等于新建set值
(integer) 6
127.0.0.1:6379> keys *				#获取所有键
1) "key"
2) "key1"
127.0.0.1:6379> get key				#获取值
"xiaoye"
127.0.0.1:6379> 
############################################################################
*redis中执行i++操作,一般用于浏览量、点赞数(计数器)*

127.0.0.1:6379> FLUSHDB			#flushdb 清空当前数据库,flushall 清空所有数据库 
OK
127.0.0.1:6379> keys *			#获取当前数据库所有的键
(empty array)
127.0.0.1:6379> set views 0		#设置浏览量0
OK
127.0.0.1:6379> get views		#获取浏览量
"0"
127.0.0.1:6379> INCR views		#自增一  i++ 	incr
(integer) 1
127.0.0.1:6379> DECR views		#自减一 	i-- 	decr
(integer) 0
127.0.0.1:6379> INCRBY views 10	#自增10 设置步长
(integer) 10
127.0.0.1:6379> DECRBY views 10	#自减10 设置步长为10
(integer) 0
127.0.0.1:6379> 
############################################################################
*字符串 范围  getranage*
127.0.0.1:6379> set key1 'xiaoye,number one' 	#设置字符串
OK	
127.0.0.1:6379> get key1						#获取值				
"xiaoye,number one"
127.0.0.1:6379> GETRANGE key1 0 4				#截取0到4的字符串,相当于subString
"xiaoy"
127.0.0.1:6379> GETRANGE key1 0 5				
"xiaoye"
127.0.0.1:6379> GETRANGE key					#截取不存在的键,则会报错
(error) ERR wrong number of arguments for 'getrange' command
127.0.0.1:6379> GETRANGE key1 0 -1				#截取全部的值 -1  和 get 一样
"xiaoye,number one"
############################################################################
*替换 setrange*
127.0.0.1:6379> get king						
"xiaoye,number one"
127.0.0.1:6379> SETRANGE king 0 'xiaoya'		#从第0个位置开始替换键的值
(integer) 17
127.0.0.1:6379> get king
"xiaoya,number one"
127.0.0.1:6379> 
############################################################################
*设置过期时间*
setex (set with expire)		#设置键的过期时间
setnx (set if not exist)	#如果键不存在,则创建键(一般用于分布式锁)

127.0.0.1:6379> SETEX temp 30 'study redis'		#设置键30秒过期
OK
127.0.0.1:6379> get temp						#获取键值
"study redis"
127.0.0.1:6379> get temp						#过期后获取键值
(nil)											#表示不存在
127.0.0.1:6379> SETNX name '123'				#如果不存在则设置键
(integer) 1										#返回1 设置成功
127.0.0.1:6379> setnx name '456'				#如果存在,则不进行创建或者覆盖
(integer) 0										#返回0 设置失败
127.0.0.1:6379> get name						#获取键值
"123"											
127.0.0.1:6379> setnx temp '789'				#设置过期后的键
(integer) 1
127.0.0.1:6379> get temp						#获取后发现,设置成功
"789"
127.0.0.1:6379> EXISTS temp						#判断键是否存在 exists
(integer) 1
############################################################################
批量存取值  mset mget  (maney get /set)
 
127.0.0.1:6379> msetnx key1 value2 key2 value2 key3 value3	#批量设置键值 存在则不创建
(integer) 1
127.0.0.1:6379> keys *										#获取所有键
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> msetnx key1 123 key4 value4		#批量设置键值时,有存在的键时
												#则不进行创建,统一成功或者失败
												#体现了批量设值的原子性
(integer) 0
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3				#批量获取键中的值
1) "value2"
2) "value2"
3) "value3"
############################################################################
设置对象
127.0.0.1:6379> msetnx user:1:name 'zhangsan' user:1:age 24  #user:1:name 当做键
															 #user:1:age 当做键
															 #user:1  id体现为1
(integer) 1
127.0.0.1:6379> get user:1									#直接get user:1 是获取不到值的
(nil)														#因为其本身就不是一个对象
127.0.0.1:6379> mget user:1:name  user:1:age				#还需要批量获取键值
1) "zhangsan"
2) "24"
############################################################################
getset 先获取值,然后set新的值,返回旧值
127.0.0.1:6379> getset user 'zhangsan'	#如果获取的值为空时,返回null,并把新的值赋进去
(nil)
127.0.0.1:6379> set user 'zhangsan'		
OK
127.0.0.1:6379> getset user 'lisi'		#如果获取的值不为空,则返回值,并摄入新值
"zhangsan"
127.0.0.1:6379> get user
"lisi"
############################################################################
String类型的应用场景:
1.计数器 
2.使用多场景的数据统计  (以用户为维度的多数据的统计,粉丝数、点赞数的等)

List类型

List基础命令
Lpush key [values]		 往list里面插入值,一次可以插入多值 
Rpush key [values] 		从右边开始插入值,可插多值
Lrange key  start  end   获取list中的值 必须要有区间   取值也是倒叙的,从左边第一个开始取  只能从左边取
Lpop key   					移除list里面的值,有且只能移除最外层的一个值。返回被移除的值
Lpop key 					从右边开始移除值,返回被移除的值
Lindex	 key index  		通过下标获取list里的值
Llen	 key							获取list的长度
Lrem key  count value   #移除几个指定的值
ltrim key star end        #通过下标截取指定的元素,并替换现在的数组、
rpoplpush					#移除最后一个值,并添加在新数组中
lset key index item   	#通过下标,更新数组中的值
Linsert key before item value  #在指定元素前或者后,插入具体的值
插入值
127.0.0.1:6379> flushdb						#清空数据库
OK	
127.0.0.1:6379> Lpush list one two thess	#push值到集合里 
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1			#lrange 从左边还是获取所有值	
1) "thess"
2) "two"
3) "one"
127.0.0.1:6379> rpush list frist seconed	#从右边push 值到集合里
(integer) 5
127.0.0.1:6379> LRANGE list -1				#只能从左边获取,右边获取报错
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE list 0 -1			#获取所有值
1) "thess"
2) "two"
3) "one"
4) "frist"
5) "seconed"
127.0.0.1:6379> lpop list				#从左边删除一个值
"thess"
127.0.0.1:6379> lpop list 1				#只能删除最外面的值,无法指定下标删除
(error) ERR wrong number of arguments for 'lpop' command
127.0.0.1:6379> rpop list				#从右边删除第一个值
"seconed"
127.0.0.1:6379> LRANGE list 1			#Lrange 必须要有区间来获取
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE list 0 -1		#获取所有的值
1) "two"
2) "one"
3) "frist"
#####################3########################
lindex  获取指定的值
127.0.0.1:6379> LINDEX list 1		#从左边开始获取下标为一的值
"one"
127.0.0.1:6379> LLEN list			#获取list的长度
(integer) 3
127.0.0.1:6379> 
Lrem  移除指定的值
127.0.0.1:6379> LREM list 1 one
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "frist"
#####################################################
rpoplpush #移除数组中最后一个值,并添加到一个新数组中
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "frist"
127.0.0.1:6379> RPOPLPUSH list newlist
"frist"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
127.0.0.1:6379> LRANGE newlist 0 -1
1) "frist"
127.0.0.1:6379> 
###################################################
ltrim  截取指定的长度
127.0.0.1:6379> lpush list xiaoye		#插入数据
(integer) 2
127.0.0.1:6379> LPUSH list xiaoya		#插入数据
(integer) 3
127.0.0.1:6379> lrange list 0 -1		#获取数据
1) "xiaoya"
2) "xiaoye"
3) "two"
127.0.0.1:6379> ltrim list 1 2			#通过下标截取数据
OK
127.0.0.1:6379> LRANGE list 0 -1		#覆盖了原数组
1) "xiaoye"
2) "two"
###################################################
127.0.0.1:6379> LRANGE list 0 -1
1) "xiaoye"
2) "number one"
127.0.0.1:6379> LINSERT list before xiaoye hello		#在指定元素前插入元素
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "xiaoye"
3) "number one"
127.0.0.1:6379> LINSERT list after 'number one' world	#在指定元素后,插入值
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "xiaoye"
3) "number one"
4) "world"

小结

  • list其实就是一个链表。可以从左边、右边插入 获取值
  • 如果key不存在,则会创建一个新的链表
  • 如果key存在,则会在链表里插入值
  • 链表从两边操作,新增或修改值效率高一些。操作中间的值,效率相对低一些。
  • 可以作:消息队列(Lpush Rpop) 栈(Lpush Lpop)使用
内容简介: Redis的的是完全开源免费的,遵守BSD协议,是一个高性能的键值数据库。是当前最热门的的的NoSql数据库之一,也被人们称为数据结构服务器。本课程从Redis基本数据类型开始,了解不同数据类型的用法和底层实现 。进一步学习Redis的一些高级特性与工作原理。了解Redis在分布式环境中的工作方式,和实际项目的使用及问题解决。 为什么学Redis? 原因很简单,快! 这个问题在大并发,高负载的网站中必须考虑.redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势。 项目中使用Redis,主要是从两个角度去考虑:性能状语从句:并发。当然,Redis的的的还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件代替,并不是非要使用Redis的的的。因此,这个问题主要从性能和并发两个角度去答。 性能: 我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存,这样,后面的请求就去缓存中读取,请求使得能够迅速响应。 并发: 在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用的的Redis的做一个缓冲操作,让请求先访问到的Redis的的,而不是直接访问数据库。 redis优势: 1.运行在内存,速度快官方号称支持并发11瓦特读操作,并发8瓦特写操作,可以说是相当彪悍了。 2.数据虽在内存,但是提供了持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务 3.支持数据结构丰富(string(字符串),list(链表),set(集合),zset(sorted set - 有序集合))和Hash(哈希类型,md5加密出来的那个串) 课程大纲: 为了让大家快速系统了解Redis核心知识全貌,我为你总结了「Redis核心框架图」,帮你梳理学习重点,建议收藏!!
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页