热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知(

在SQLServer2005中,SQLServerServiceBroker用于创建会话以交换消息。消息交换在目标和发起方这两端之间进行。使用

在SQLServer2005中, SQL Server Service Broker 用于创建会话以交换消息。 消息交换在目标和发起方这两端之间进行。 使用 SqlDependency 订阅查询通知是直接的:SqlDependency 对象将管理数据库中设置通知涉及到的复杂性。建立通知后,对象便会监视实现通知


在SQLServer2005中,SQL Server Service Broker 用于创建会话以交换消息。 消息交换在目标和发起方这两端之间进行。

使用 SqlDependency 订阅查询通知是直接的:SqlDependency 对象将管理数据库中设置通知涉及到的复杂性。建立通知后,对象便会监视实现通知的基础数据库对象,当 SQL Server 创建查询通知时,将在应用程序中调用事件处理程序。

对于应用程序接收SQL Server Service Broker通知,只能获取到对应数据库表数据做了何种更新,而无法获取更新的数据,而我们却可以利用这个通知,来做缓存依赖,来达到缓存过期的目的。

使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

例如:select * from table1,select column1 from table1,select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。

以下以一个实际的例子(sqlDep项目)来说明如何使用ServerBroker和SqlDependency类来做缓存依赖,充分利用服务器资源和提高应用程序性能,并且封装以提供给开发人员最大的便利性,我们需要按照如下步骤操作:

1. 首先要在使用的数据库执行 ALTER DATABASE AdventureWorks SET ENABLE_BROKER 以启用该功能,执行时必须关闭所有可能锁表的操作和作业。

2. 打开sqlDep示例,运行ServiceBrokerTest.aspx以查看结果,查看代码。

3. 在现有应用程序中增加更改通知以及缓存机制。

a) 在webconfig<configuration>节中添加<connectionStrings>节,并配置连接字符串。

b) 在webconfig<system.web>节中添加

<caching>

<cache percentagePhysicalMemoryUsedLimit="60" privateBytesPollTime="00:05:00" />

caching> (此项配置全局缓存设置,可选)

c) 建立数据访问层,如何封装编写不限,只要具有返回数据的方法即可。

d) 嵌入或者重写DaBase.cs中的protected virtual DataTable GetDataTable方法,具体请参考sqlDep示例,该方法提供自动响应程序表发生的更改,自动设定缓存机制,封装此方法后,对于开发人员,只需要按照以往开发习惯提供任意sql语句编写程序获取数据。

e) 继承DaBase类或自己编写具有protected virtual DataTable GetDataTable方法的类,并调用该方法,参见DaDimCustomer.cs。

以下我们以sqlDep做测试,以验证可行性及其性能:

我们以SqlServer2005自带的AdventureWorksDW数据库中的DimCustomer表为例,该表有29列,各种数据类型都有,18484行,7984KB数据,平均每行0.43KB。

我们以每次查询20页,查询该表的所有列作为测试。由于缓存的是查询结果,所以内存变化可以根据每次查询的数据量为基准,20行大小大约是8.6KB,缓存默认设置是允许使用服务器内存的90%,

假设对应的数据库表不做更新操作,假设Web服务器有1G的内存可使用缓存,

则可以缓存12万份不重复结果(这里没有计算.net本身每个数据实体,每个缓存相关数据所占有的空间,相对于数据而言可以忽略不计),

缓存命中率大都集中在常用查询,例如商品列表第一页,某个商品分类第一页等,一旦有某个用户使用了查询,则其他用户可以不需要访问数据库即可得到所需数据。即使缓存如果超过了程序规定的最大数据,.net运行时也会自动随即清空缓存,这并不影响程序运行。

以下附上完整代码:

WebConfig文件:

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片Code

<connectionStrings>

<add name="Conn" providerName="System.Data.SqlClient" connectionString="Data Source=localhost;Initial Catalog=AdventureWorksDW;User ID=sa;Password=sa"/>

connectionStrings>

数据访问类:

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片Code

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片using System;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using System.Configuration;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using System.Data;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using System.Data.SqlClient;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
/**////



采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
/// SqlDbHelper 的摘要说明

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
///

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片public sealed class SqlDbHelper

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
单态模式#region 单态模式

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
static SqlDbHelper sqlDbHelper = new SqlDbHelper();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
public static SqlDbHelper Instance() 采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{ return sqlDbHelper; }

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
private SqlDbHelper()

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
this.connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
#endregion


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
private string connectionString;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
public string ConnectionString

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
get 采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{ return connectionString; }

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
set 采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{ connectionString = value; }

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
public DataTable GetDataTable(string strSql)

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
string connStr = this.connectionString;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using (SqlConnection conn = new SqlConnection(connStr))

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 SqlCommand comm
= new SqlCommand(strSql, conn);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 SqlDataAdapter da
= new SqlDataAdapter(comm);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 DataTable dt
= new DataTable();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 da.Fill(dt);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
return dt;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
public int ExecuteNonQuery(string strSql)

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
string connStr = this.connectionString;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using (SqlConnection conn = new SqlConnection(connStr))

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 SqlCommand comm
= new SqlCommand(strSql, conn);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
if (conn.State == ConnectionState.Closed) conn.Open();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
return comm.ExecuteNonQuery();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
public SqlDependency AddSqlDependency(string strSql, OnChangeEventHandler sqlDep_OnChange)

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
string connStr = this.connectionString;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
using (SqlConnection conn = new SqlConnection(connStr))

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 SqlCommand comm
= new SqlCommand(strSql, conn);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
// 添加依赖

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
SqlDependency sqlDep = new SqlDependency(comm);

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 sqlDep.OnChange
+= sqlDep_OnChange;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
if (conn.State == ConnectionState.Closed) conn.Open();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 comm.ExecuteNonQuery();

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
return sqlDep;

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
/**////

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
/// 对表增加依赖列,用于Sql依赖,或者用某个int列也可

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
///

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
///

表名,如果不是dbo所有者,请提供包括所有者的完整表名

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
///

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 public int AddDependencyCloumn(string tableName)

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片{

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
return this.ExecuteNonQuery(string.Format("declare @num int "

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
+ "set @num = (select count(*) from syscolumns where id=object_id(&#39;{0}&#39;) and name = &#39;dep&#39;) "

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片
+ "if @num = 0 ALTER TABLE {0} ADD dep bit NOT NULL CONSTRAINT dep{0} DEFAULT 0 ", tableName));

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片 }


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片}


采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片Code

using System;



using System.Data;

using System.Data.SqlClient;

using System.Web;

using System.Web.Caching;



///



/// 要使用SqlServer2005 Service Broker,首先要在使用的数据库执行 ALTER DATABASE AdventureWorks SET ENABLE_BROKER 以启用该功能,执行时必须关闭所有可能锁表的操作和作业

/// 使用依赖的sql语句,不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,

/// 不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀

/// 依赖只针提供一次通知,所以重新发起某次查询则需要重新提供依赖sql语句

///

/// 优点:此应用比较适合访问次数大于更新次数的情况,访问次数比更新次数越多,速度提升越明显

/// 缺点:对服务器内存要求较高

///

public abstract class DaBase

{

private SqlDbHelper sqlDbHelper;

//

private Cache pageCache;



public DaBase(Cache cache)

{

sqlDbHelper
= SqlDbHelper.Instance();

this.pageCache = cache;

}



///

/// 清除缓存

///

///

缓存名称

protected virtual void ClearCache(string cacheName)

{

System.Collections.IDictionaryEnumerator cacheEnum
= pageCache.GetEnumerator();

while (cacheEnum.MoveNext())

{

// 只清除与此业务相关的缓存,根据表名

if (cacheEnum.Key.ToString().ToLower().IndexOf(cacheName.ToLower()) > 0)
pageCache.Remove(cacheEnum.Key.ToString());

}

}



///



/// 创建Service Borker通知(请确认Service Borker已开启),自动响应程序表发生的更改,自动设定缓存机制

///

///

System.Web.Caching.Cache对象

///

查询数据的sql语句

///

数据库表所有者

///

表名

///

列名,随意某个小列(最好是bit,tinyint,varchar(1),int)

///

protected virtual DataTable GetDataTable(string selectSql, string dbOwner, string tableName, string column)

{

// 用于Service Broker跟踪的表范围sql

string depSql = string.Format("select {0} from {1}.{2}", column, dbOwner, tableName);



DataTable dt
= new DataTable();

if (pageCache[selectSql] != null)

dt
= pageCache[selectSql] as DataTable;

else

{

// 触发行级依赖,如果该表的指定范围内的行被修改,则会收到SqlServer的通知,并且清空相应缓存

SqlDependency sqlDep = sqlDbHelper.AddSqlDependency(depSql,
delegate(object sender, SqlNotificationEventArgs e)
{
if (e.Info == SqlNotificationInfo.Invalid)
{
// sqlDbHelper.ExecuteNonQuery("ALTER DATABASE AdventureWorksDW SET ENABLE_BROKER");
// 写文件,数据库未开启Service Broker或者提供了无法通知的语句,例如没有写包括数据库所有者的表名。

}
this.ClearCache(tableName);
});

dt
= sqlDbHelper.GetDataTable(selectSql);

pageCache[selectSql]
= dt;

}

return dt;



}





}

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片Code

using System;



using System.Data;

using System.Web;

using System.Web.Caching;





public class DimCustomer : DaBase

{

public DimCustomer(Cache pageCache) : base(pageCache) { }





#region 分页查询顾客信息

public DataTable SelectDimCustomer(int startIndex, int maxIndex)

{

// 用于查询的sql语句

string strSql = string.Format("with t as ( "

+ " select row_number() over(order by CustomerKey Desc) as rowNum, * "

+ " from DimCustomer where &#39;1&#39; = &#39;1&#39; "

+ ") select * from t where rowNum between {0} and {1} ", startIndex, maxIndex);



return base.GetDataTable(strSql, "dbo", "DimCustomer", "CustomerKey");

}



#endregion



}

测试页面:

采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片采用SQLServer2005Broker和SqlDependency类来提供数据更改通知( - 文章图片Code

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ServiceBrokerTest.aspx.cs" Inherits="ServiceBrokerTest" %>



DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>无标题页title>

head>

<body>

<form id="form1" runat="server">

<div>

<asp:TextBox ID="txt1" Text="1" runat="server">asp:TextBox><asp:TextBox ID="txt2" Text="20" runat="server">asp:TextBox>&nbsp;<asp:Button ID="btn1" runat="server" Text="获取数据" OnClick="btn1_Click" />

<br />

<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="true">asp:GridView>

div>

form>

body>

html>





using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



public partial class ServiceBrokerTest : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{



}



protected void btn1_Click(object sender, EventArgs e)

{

DimCustomer da
= new DimCustomer(this.Cache);

this.gv1.DataSource = da.SelectDimCustomer(Convert.ToInt32(this.txt1.Text), Convert.ToInt32(this.txt2.Text));

this.gv1.DataBind();



//SqlDbHelper sqlDbHelper = SqlDbHelper.Instance();

//DataTable dt = sqlDbHelper.GetDataTable("select top 10 * from DimCustomer");

//this.gv1.DataSource = dt;

//this.gv1.DataBind();

}



}

总结:

特点:特别适合更新不频繁但是读取频繁的表,会大大提高应用程序性能。

优点:缓存越多,SQL服务器负担就越小,大大减少了IO读操作以及网络传输占用。

缺点:Web服务器会稍微增加缓存调度和内存增加的负担,并且在数据库相应表发生更改后服务器会清除该表相关的所有缓存。


推荐阅读
  • yii框架目录结构详细分析说明
    php教程|php手册yii,目录结构php教程-php手册yii框架目录结构详细分析说明猫狗大战源码,华为云电脑ubuntu,梦见放走很多爬虫,parttmpphp,seo页面描 ... [详细]
  • 【MyBatis系列7】原来SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象
    Executor原理分析前言MyBatis架构分层ExecutorBaseExecutorSimpleExecutorReuseExecutorBatchExecutor三种常用批 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Android View转Bitmap引发的思考
    前言笔者在最近在做截屏分享的功能,采用getDrawingCache()发现了两个问题,特此记录一下。View生成Bitmap的两种方式。 ... [详细]
  • smarty(模板引擎,模板技术)使用smarty主要是为了实现逻辑和外在内容的分离;特点:1、速度快 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了authenticationplugincaching_sha2相关的知识,希望对你有一定的参考价值。操作系统:windows1 ... [详细]
  • MySQLSQLyog连接数据库报错plugin caching_sha2_password could not be loaded
    下载新版的mysql8.0.11安装。为了方便安装查看,我下载了sqlyog工具连接mysql配置新连接报错:错误号码2058,分析是mysql密码加密方法变了。解决方法:wind ... [详细]
author-avatar
杜庆坤66
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有