c#中用lua指令碼執行redis命令__c#

來源:互聯網
上載者:User
c#中用lua指令碼執行redis命令

直接貼出代碼,實現執行lua指令碼的方法,用到的第三方類庫是 StackExchange.Redis(nuget上有) 註:下面的代碼是簡化後的,實際使用要修改,

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Threading.Tasks;using StackExchange.Redis;namespace TL.Cloud.KV{    public class Kv:IKv    {                      private  ConfigurationOptions _redisConfig;// = new ConfigurationOptions        private  IDatabaseAsync _db;//=Connection.GetDatabase();        private  IServer _server;// = GetServer();        private  string _keyPrefix;// 區分首碼        /// <summary>        /// 每個微服務一個kv雲執行個體,或共用雲執行個體中(無獨立首碼,服務間Key取名需要自行防止衝突)        /// </summary>        /// <param name="hostServiceName">宿主微服務</param>        public Kv(PublicCloudKvConfig config)        {            Init(config);        }        private void Init(PublicCloudKvConfig config)        {            //獨特的區分dev/100首碼,online可以沒有            _keyPrefix = string.IsNullOrWhiteSpace(config.KeyPrefix)                ?null                :config.KeyPrefix.Trim().ToLower()+':';//小寫帶冒號分割            //ali kv            var kvUrl = config.KvUrl;            _redisConfig = ConfigurationOptions.Parse(kvUrl);                       _redisConfig.Password = config.KvPassword;            _redisConfig.SetDefaultPorts(); //自動填滿預設連接埠            var connection = ConnectionMultiplexer.Connect(_redisConfig);            _db = connection.GetDatabase();            _server = GetServer();                    }        private  IServer GetServer()        {            var config = new ConfigurationOptions            {                KeepAlive = 0,                EndPoints = { _redisConfig.EndPoints[0]},                AbortOnConnectFail = false,                AllowAdmin = true            };            var conn = ConnectionMultiplexer.Connect(config);            return conn.GetServer(config.EndPoints[0]);        }        public Task<RedisResult> EvalLua(string lua, IList<RedisKey> keys, IList<RedisValue> values)        {            if (_keyPrefix != null)                keys = keys.Select(p => p.Prepend(_keyPrefix)).ToList();//加上首碼            return _db.ScriptEvaluateAsync(lua, keys.ToArray(), values.ToArray());        }                public async Task<RedisResult> EvalLua(byte[] luaSha1, IList<RedisKey> keys, IList<RedisValue> values)        {            if (_keyPrefix != null)                keys = keys.Select(p => p.Prepend(_keyPrefix)).ToList();//加上首碼            return await _db.ScriptEvaluateAsync(luaSha1, keys.ToArray(), values.ToArray());        }                      public async Task<byte[]> LoadLuaToServerAsync(string lua)        {            var sha1 = lua.CalcLuaSha1();//本地計算            if(!await _server.ScriptExistsAsync(sha1))//伺服器上不存在                 sha1 = await _server.ScriptLoadAsync(lua);//應該和計算的相同                            return sha1;        }    }}


下面是測試程式碼片段

//下面是測試代碼[Test]        public async Task LoadLuaToServerAsync()        {            var key = "TestEvalLua10010";            var fieldContent = "testlua10011";            const string lua =                "redis.call('SET', KEYS[1], ARGV[1])\n" +                "return redis.call('GET', KEYS[1])\n";            var sha2 = lua.CalcLuaSha1();            var sha1 = await _kv.LoadLuaToServerAsync(lua);            Assert.AreEqual(20, sha1.Length);            for (var i = 0; i < 20; i++)                Assert.AreEqual(sha1[i],sha2[i]);                        var keys = new List<RedisKey> { key };            var values = new List<RedisValue> { fieldContent };            var result = await _kv.EvalLua(sha1, keys, values);            Assert.AreEqual(fieldContent, (string)result);        }


計算sha1用到的方法

//計算lua的sha1結果,作為執行lua的參數        public  static byte[] CalcLuaSha1(this string lua)        {            SHA1 sha1 = new SHA1CryptoServiceProvider();            var bytesSha1In = Encoding.Default.GetBytes(lua);            return sha1.ComputeHash(bytesSha1In);        }


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.